$()
(안에 넣을 수 없는 ) 긴 명령의 출력을 Case 문으로 파이프하고 싶기 때문에 xargs
다음과 같이 사용합니다 .
echo "this" | xargs -I{} case {} in; this) echo "is a test";; esac
작동하지 않습니다. 오류가 발생합니다.
zsh: parse error near `)'
그리고 다음은 문제없이 실행됩니다
case "this" in; this) echo "is a test";; esac
어떻게 해결할 수 있나요?
답변1
case...in...esac
sh
언어와 유사한 구성이므로 ( xargs
셸 구성이 아닌 셸과 별도의 명령) 이를 위해 셸을 호출해야 합니다.
echo this | xargs -I'{}' sh -c '
case $1 in
(this) echo "is a test";;
esac' sh '{}'
{}
어떤 경우든 ( 인용 및 공백 처리 후 xargs
결국 각 줄로 확장되는 내용 )이 없는지 확인해야 합니다.암호인라인 스크립트에 대한 인수 sh
(또는 sh뿐만 아니라 모든 인터프리터에 대한 코드 인수), 그렇지 않으면 코드 주입 취약점이 됩니다.
대신 여기서는 {}
인라인 스크립트( script 를 사용하여 검색)에 매개변수로 전달되므로 $1
쉘 코드로 해석될 수 없습니다.
case
현재( 여기) 셸 zsh
에서 명령 출력의 모든 줄에 대해 구성을 실행 하려면 ( xargs -I'{}'
그런데 백슬래시, 작은따옴표, 큰따옴표를 포함하지 않고 공백으로 시작하지 않는 줄만), 이것을 할 수 있습니다 :
while IFS= read <&3 -r line; do
case $line in
(this) ...;;
esac 3<&-
done 3< <(a-command)
또는
for line (${(f)"$(a-command)"}) case $line in
(this) ...;;
esac
(그 사람은 빈 줄을 건너뜁니다).
답변2
case
나는 원래 문이 여러 줄에 걸쳐 구성되었기 때문에 문제가 있다고 생각했습니다 . 다음과 같이 더 많은 성공을 거둘 수 있습니다.
yourcommand | while read LINE ; do
case "$LINE" in; this) echo "is a test";; esac
done