제가 사용할 수 있는 덜 관대한 프로그램이 있습니다. 불행하게도 이 프로그램은 다음 사항만 허용하지 않습니다.
"command -a -b -c"
또는
"command -abc"
그래서 항상 다음을 입력해야 합니다.
command -a && command -b && command -c
입력하는 더 효율적인 방법이 있다고 확신하지만 알아낼 수는 없습니다.
답변1
다음을 수행할 수 있습니다.
echo -a -b -c | xargs -n 1 command
또는:
xargs -n1 command <<< '-a -b -c'
그리고 약간의 껍질.
그러나 그것이 영향을 미칠 것이라는 점에 유의하십시오 command
.
그리고 zsh
:
autoload zargs # best in ~/.zshrc
zargs -n 1 -- -a -b -c -- command
또는 간단하게:
for o (-a -b -c) command $o
호출 이 실패하면 command
호출이 중단되지 않습니다(종료 상태 255로 실패하지 않는 한).
이렇게 하려면 다음이 필요합니다.
for o (-a -b -c) command $o || break
여전히 $?
실패한 호출의 종료 상태에 도달하지 못합니다 command
. 다음과 같이 변경할 수 있습니다.
(){for o (-a -b -c) command $o || return}
그러나 그때까지는 다음보다 더 길었습니다.
command -a && command -b && command -c
답변2
command
(귀하의 경우) 히스토리 확장을 통해 이전 명령줄의 첫 번째 단어를 참조할 수 있으며 !!:0
여기에 필요한 매개변수를 추가할 수 있습니다.
command -a && !!:0 -b && !!:0 -c
예를 들어:
% echo foobar && !!:0 spamegg && !!:0 baz
echo foobar && echo spamegg && echo baz
foobar
spamegg
baz
만약에 참고하세요스테판 차젤라스는 다음과 같이 지적합니다., 이로 인해 예상치 못한 확장이 발생할 수도 있습니다.
답변3
루핑 쉘 함수를 캡슐화하는 것은 어떻습니까?
yourcmd() {
local arg
for arg; do
thing "$arg" || return
done
}
여기서 "thing"은 호출하려는 실제 명령입니다. 그리고 나서 간단히
yourcmd -a -b -c
이를 어떤 명령에도 일반화할 수 있습니다.
splitargs() {
local cmd arg
cmd="$1"
shift
for arg; do
"$cmd" "$arg" || return
done
}
그 다음에
splitargs somecommand -a -b -c
답변4
쉘 스크립트 만들기여러 번 실행, 첫 번째 인수를 명령으로 사용하고 나머지 인수를 한 번에 하나씩 실행합니다.
./여러 번 실행곱슬 ABCD
스크립트는 컬을 명령으로 사용하고 "curl A", "curl B", "curl C", "curl D"를 실행해야 합니다. 이제 스크립트가 제어되므로 하나의 명령이 실패하면 스크립트가 종료되는지, 다음 인수로 계속 진행되는지, 사용자 입력을 기다리는지 등을 결정할 수 있습니다. 개별 명령의 실행을 기반으로 전체 스크립트의 종료 상태를 확인할 수도 있습니다.
MultiRun 스크립트는 다음과 같습니다.
#! /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".
이제 다음 명령을 실행하십시오:
./MultiRun echo 1 2 3 4
아래와 같이 "echo 1" , "echo 2" , "echo 3" , "echo 4" 의 출력을 얻으십시오:
1
2
3
4
이는 매우 유연하고 재사용 가능한 솔루션입니다.