Case 문에서 xargs 사용

Case 문에서 xargs 사용

$()(안에 넣을 수 없는 ) 긴 명령의 출력을 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...esacsh언어와 유사한 구성이므로 ( 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

관련 정보