Chạy lại cùng một lệnh với một tham số khác


13

Tôi biết rằng tôi có thể chạy lệnh sau

ls Some{File,Folder}

Và nó tương đương với việc chạy này:

ls SomeFile SomeFolder

(Tôi cũng sử dụng nó rất nhiều cho những thứ như mv place_{a,b})

Tuy nhiên, tôi đã tự hỏi nếu có một lối tắt khác, nơi tôi có thể làm một cái gì đó như thế này:

run-command --a --whole --lot --of --flags parameter a; \
     run-command --a --whole --lot --of --flags parameter b

Và tôi chỉ phải gõ run-command --a --whole --lot --of --flags parameter {a,b}hoặc một cái gì đó tương tự.


Điều đó phụ thuộc vào run-command, nhiều lệnh Unix xử lý một số đối số tệp theo trình tự.
vonbrand

Câu trả lời:


13

Giả sử rằng bạn đang sử dụng GNU bashhoặc một cái gì đó tương tự:

Có lẽ là một forvòng lặp?

for x in a b
do
    run-command --a --whole --lot --of --flags parameter $x
done

cũng có thể được viết trong một dòng như for x in a b; do run-command --a --whole --lot --of --flags parameter $x ; done


1
hoặc nếu bạn có nhiều thứ bạn muốn chạy, bạn có thể sử dụng bash mở rộng như vậyfor x in {a..z}; do ; run-command --a --whole --lot --of --flags parameter $x ; done
h3rrmiller

Những gì đi có thể có một danh sách ngăn cách không gian được tạo ra theo nhiều cách. Vì vậy, yeah, {a..z}, *.pdf, $(find ...)...
njsg

Tôi không biết tại sao tâm trí tôi không nhảy vào vòng lặp. Cảm ơn! Đây có lẽ sẽ là những gì tôi sử dụng. Ý tưởng chức năng là tốt, nhưng tôi thích điều này tốt hơn.
ashays

1
Một-liner chỉ làm việc cho tôi sau khi loại bỏ ;các dotừ khóa sau đây .
dong dỏng

@jimp Cảm ơn, tôi đã thay đổi mã để loại bỏ điều đó ;.
njsg

5

Nếu bạn không viết kịch bản này và chỉ muốn chạy nó dễ dàng trên một dòng lệnh, thì xargslệnh có lẽ là thứ bạn đang tìm kiếm.

xargs sẽ lấy một loạt nội dung từ đầu vào tiêu chuẩn và sử dụng nó làm đối số cho một lệnh, chạy lệnh đó nhiều lần nếu cần.

Hãy thử như sau:

echo parameter a,parameter b | xargs -n 1 -d , run-command --a --whole --lot --of --flags

Trong ví dụ này, bạn chỉ đơn giản là cung cấp cho xargs các hoán vị mà bạn muốn nó chạy.

Cờ "-n 1" để báo cho xargs chỉ sử dụng 1 trong số các đối số cho mỗi lần chạy.

Cờ "-d," yêu cầu xargs tìm kiếm "," trên đầu vào dưới dạng dấu phân cách giữa các đối số để chạy. (Lưu ý rằng nếu đối số có dấu "," trong đó, bạn sẽ cần thay đổi đối số này thành đối số khác. Nếu đối số của bạn không có khoảng trắng trong chúng, bạn có thể bỏ qua cờ này hoàn toàn.)

Xem man xargsđể biết thêm.


4

Bạn cũng có thể sử dụng một hàm, điều này không giới hạn bạn ở cuối đối số thay đổi của bạn:

runcom() { run-command --a --whole --lot --of --flags parameter "$1" ; }

runcom a
runcom b

2

Bạn có thể thực hiện thay thế trong lệnh trước. Điều này sẽ không hoạt động với ví dụ {a, b} của bạn, bởi vì tất cả các trường hợp của 'a' sẽ được thay thế bằng 'b'. Nhưng hãy tưởng tượng bạn muốn thực hiện các lệnh sau:

run-command --a --whole --lot --of --parameter --format xml
run-command --a --whole --lot --of --parameter --format son

Bạn có thể làm điều đó với

run-command --a --whole --lot --of --parameter --format xml
!!:s/xml/json/

Bash sẽ thay thế và chạy

run-command --a --whole --lot --of --parameter --format json

Sử dụng gs (thay thế toàn cầu) để thực hiện một số thay thế, không chỉ một.


1

aliaslệnh trong bash:

$ alias shotcommand='run-command --a --whole --lot --of --flags parameter'

Cách sử dụng là: $ shotcommand a


Ngoài ra còn có các hàm, nếu mã phức tạp hơn một chút :-)
njsg

2
Giải pháp này chỉ hoạt động nếu tham số thay đổi của tôi xảy ra là cuối cùng, đúng không?
ashays

Đúng. Bạn đúng rồi.
dchirikov
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.