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


8

Tôi đã có một chương trình không thực sự cho phép để làm việc với. Thật không may, chương trình này không chỉ cho phép những điều sau đây

"command -a -b -c"

hoặc là

"command -abc"

Vì vậy, tôi luôn luôn gõ như sau

command -a && command -b && command -c

Tôi khá chắc chắn rằng có cách hiệu quả hơn để gõ nó, nhưng không thể tìm ra nó.


5
Điều này sẽ hoàn toàn phụ thuộc vào lệnh. Vui lòng bao gồm nó trong câu hỏi của bạn.
tham gia

1
Bạn có nhiều câu trả lời khác nhau, nhưng tôi cá là bạn sẽ gắn bó cmd -a; cmd -b; cmd -clâu dài, như tất cả con người làm.
jimmij

Câu hỏi này quá rộng mà không có chi tiết về command. Trong trường hợp chung command -a -b -c, command -abccommand -a && command -b && command -ccó ý nghĩa khác nhau ..
Dmitry Grigoryev

Câu trả lời:


14

Bạn có thể làm:

echo -a -b -c | xargs -n 1 command

Hoặc là:

xargs -n1 command <<< '-a -b -c'

với một số vỏ.

Nhưng hãy cẩn thận rằng nó ảnh hưởng đến stdin của command.

Với zsh:

autoload zargs # best in ~/.zshrc
zargs -n 1 -- -a -b -c -- command

Hoặc đơn giản:

for o (-a -b -c) command $o

Không ai trong số họ sẽ hủy bỏ nếu bất kỳ commandyêu cầu nào thất bại (trừ khi nó không thành công với trạng thái thoát 255).

Đối với điều đó, bạn muốn:

for o (-a -b -c) command $o || break

Điều đó vẫn không thành công đến $?trạng thái thoát của lệnh commandgọi không thành công ). Bạn có thể thay đổi điều đó thành:

(){for o (-a -b -c) command $o || return}

Nhưng vào thời điểm đó, nó đã dài hơn:

command -a && command -b && command -c

Cảm ơn bạn Stéphane cho tùy chọn này. Combinaison của !!: 0 và xargs đã lừa.
Douda

10

Bạn có thể tham khảo từ đầu tiên của dòng lệnh trước đó ( commandtrong trường hợp của bạn) bằng cách mở rộng lịch sử !!:0và sau đó bạn chỉ có thể thêm các đối số cần thiết vào nó.

command -a && !!:0 -b && !!:0 -c

Ví dụ:

% echo foobar && !!:0 spamegg && !!:0 baz    
echo foobar && echo spamegg && echo baz
foobar
spamegg
baz

Lưu ý rằng, như Stéphane Chazelas đã chỉ ra , điều này cũng có thể dẫn đến việc mở rộng bất ngờ.


1
Chính xác những gì tôi cần! Cảm ơn bạn rất nhiều heemayl
Douda

2
!!:0(trong vỏ có hỗ trợ mở rộng lịch sử csh) sẽ mở rộng để từ đầu tiên của Command- trước dòng , không lệnh trước đó.
Stéphane Chazelas

@ StéphaneChazelas làm rõ ..
heemayl

Chúng tôi không biết từ đầu tiên của dòng lệnh trước đó là gì. Cố gắng nhập unamevà sau đó echo foobar && !!:0 spamegg && !!:0 baz, sẽ mở rộng đến echo foobar && uname spamegg && uname baz.
Stéphane Chazelas

2
Một !là đủ: !:0nhưng với @ StéphaneChazelas, điểm tốt hơn là sử dụng !#:0trong đó giá !#trị trung bình Toàn bộ dòng lệnh được nhập cho đến nay .
Costas

3

Làm thế nào về một hàm shell bao quanh một vòng lặp?

yourcmd() {
    local arg
    for arg; do
        thing "$arg" || return
    done
}

Trong đó "điều" là lệnh thực tế bạn muốn gọi. Sau đó, đơn giản

yourcmd -a -b -c

Bạn thậm chí có thể khái quát hóa điều này với bất kỳ lệnh nào:

splitargs() {
    local cmd arg 
    cmd="$1"
    shift
    for arg; do
        "$cmd" "$arg" || return
    done
}

Sau đó

splitargs somecommand -a -b -c

1

Giữa các câu trả lời sáng tạo và sâu sắc, đây là một cái gì đó đơn giản với tên gõ ít ký tự hơn:

# under the assumption that you have a frequently-used set of flags: -a -b -c
alias c='command -a && command -b && command -c'

# slightly more generally, name some aliases according to the set of flags
alias cabc='command -a && command -b && command -c'
alias cdef='command -d && command -e && command -f'

# more generally, just shorten the command name and then pass whatever flags you want
alias c=command
c -e && c -f && c -f

0

Tạo một tập lệnh shell MultiRun , lấy Parameter đầu tiên làm Command và chạy cái này với các tham số còn lại một lần.

./ MultiRun cuộn ABCD

Tập lệnh của bạn sẽ lấy curl làm lệnh và chạy "curl A", "curl B", "curl C", "curl D". Bây giờ, do tập lệnh của bạn nằm trong tầm kiểm soát, bạn có thể quyết định liệu một lỗi trong bất kỳ một lệnh nào sẽ chấm dứt tập lệnh hay tiếp tục Thông số tiếp theo hoặc chờ người dùng nhập liệu hay bất cứ điều gì. Bạn thậm chí có thể quyết định trạng thái thoát của toàn bộ tập lệnh, dựa trên việc thực hiện các lệnh riêng lẻ.

MultiRun Script có thể giống như thế này:

#! /bin/bash
COMMAND=$1
shift #### Remove COMMAND from existing Parameters
for PARAMETER in "$@" ; #### Process all remaining Parameters
do
  # echo Executing "$COMMAND $PARAMETER" now #### Uncomment this line to see what command is getting executed.
  $COMMAND $PARAMETER
  # Check exit status and take action or wait for user input , if required.
  # read -p "finished executing command. press enter to continue. waiting..." #### Uncomment this line to pause between commands.
done
# Depending on the individual exit statuses , choose your exit status N with "exit $N".

Bây giờ hãy thực hiện điều này:
./MultiRun echo 1 2 3 4
để nhận đầu ra của "echo 1", "echo 2", "echo 3", "echo 4" như thế này:
1
2
3
4

Nó là một giải pháp rất linh hoạt và có thể tái sử dụng.

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.