Truyền một đối số cho nhiều lệnh trong một dòng


10

Tôi muốn có thể chạy nhiều lệnh trên cùng một tệp trong một dòng. Cách tôi hiện đang làm điều này là:

commandA file && commandB file && perl -ne '...' file

Bản năng ruột của tôi nói với tôi rằng nên có một cách để cung cấp đối số tên tệp chỉ một lần và chuyển nó thành cả hai lệnh đồng thời thông qua xargshoặc một cái gì đó tương tự:

find file | xargs commandA && xargs commandB && xargs perl -ne '...'

Khi tôi thử điều này, chỉ có lệnh đầu tiên chạy. Làm thế nào tôi có thể đạt được những gì tôi muốn làm?

Câu trả lời:


12

Bạn có thể định nghĩa một biến cục bộ cho điều này:

f=file; commandA $f && commandB $f && ...

Bạn cũng có thể thực hiện tất cả vô điều kiện (thay thế &&bằng ;) hoặc song song (thay thế &&bằng &).

Ngoài ra, bạn cũng có thể sử dụng mở rộng lịch sử shell để tham chiếu các đối số trước đó:

commandA file && commandB !:1 && ...

Không hoàn toàn những gì tôi có trong tâm trí, nhưng là một thay thế thú vị.
Zaid

Có gì sai với câu trả lời này?
Chris

Điều này thực sự mát mẻ! Có cách nào không xác định một biến mới?
người dùng

@user, tôi đã thêm một thay thế.
maxschlepzig


2

Bạn có thể sử dụng xargs để xây dựng một dòng lệnh, vd:

echo file | xargs -i -- echo ls -l {}\; wc -l {}

Chỉ cần bỏ phần trên vào bash để chạy nó:

echo file | xargs -i -- echo ls -l {}\; wc -l {} | bash

Mở rộng ví dụ cho tất cả các tệp * .c trong thư mục hiện tại (thoát khỏi ls ở đây để ngăn chặn mọi thay thế bí danh shell):

\ls -1 *.c | xargs -i -- echo ls -l {}\; wc -l {} | bash

Đã sử dụng điều này để có được danh sách tất cả các tệp có trong các thư mục có tên giống như "enums": find . -name "*enums*" | xargs -i echo -e echo {}\; ls -lh {}\; echo -e '\n\n' | bash
Matt Lachman

1

Tôi sẽ không bỏ phiếu cho điều này bản thân mình. Thật ngớ ngẩn và nguy hiểm, nhưng chỉ vì lợi ích của việc liệt kê các cách để làm điều này, có:

for cmd in "commandA" "commandB" "perl -ne '...'" ; do eval $cmd file ; done

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.