변수에서 유효하지 않은 명령을 실행하고 싶습니다 cmd
. 나는 그것이 나를 실패하게 하고 종료 상태를 검색하도록 할 수 없습니다. 내가 시도할 수 있는 것은 파이프를 연결하는 것입니다. :
그러면 성공적인 종료 상태를 얻게 됩니다.
$ $cmd | :
$ echo $?
0
cmd
이제 단독으로 실행하지 않고 종료 상태를 알고 싶습니다 . Bash에서는 PIPESTATUS
.
실행하려고 하는데 bash -c "$cmd | : ; rc=$(echo ${PIPESTATUS[@]} | head -c1)"
"잘못된 대체 오류"가 발생합니다.
내 질문은 다음과 같습니다
- 대시에서 첫 번째 명령의 종료 상태를 반환하는 목표를 달성하는 방법은 무엇입니까?
- 내가 무엇을 하고 있는데 대시 오류가 발생하나요?
답변1
전체 셸 구문이 있는 경우 if
셸을 실패하지 않는 를 사용할 수 있습니다.
if (eval "$cmd"); then
: # do nothing, it worked
else
printf 'Command %s failed with code %d\n' "$cmd" $?
fi
if ! eval…
부정하면 종료 코드가 숨겨지므로 더 명확한 구문을 사용할 수 없습니다 . "아무것도 하지 않음"이 존재하는 이유는 쉘 구문 때문입니다.필요명령이 포함된 then 블록은 생략하거나 비워둘 수 없습니다.
중요한 점은 if
평가된 명령이 실패하더라도 이는 셸 실패가 아니라는 것입니다.
대괄호는 하위 쉘에서 명령을 실행합니다. 이렇게 하면 명령이 스크립트에 영향을 미치는 변수를 설정하거나 exit 1
스크립트를 완전히 종료하는 등의 작업을 수행할 수 없습니다.
마지막으로, 인용되지 않은 명령이 예상하지 못한 방식으로 단어를 분리하기 때문에 eval
내가 어떻게 사용했는지 주목하세요 . $cmd
가 있는 경우 cmd='rm -Rf "foo * baz"'
실행할 때 $cmd
실제로 실행 중인 것은 다음과 같습니다 rm -Rf \"foo * baz\"
.~ 할 것이다*
디렉터리의 모든 파일로 확장되어 모든 항목이 삭제됩니다(두 파일 "foo
및 제외 baz"
). 이는 rm
글로벌 확장 전의 세 가지 매개변수로, 예상한 것과는 다릅니다. eval
일반적인 쉘 명령 구문 분석이 적용되므로 놀라움이 줄어들 것이라고 생각합니다. 이것이 텍스트 파일에서 읽은 줄이 아닌 스크립트 내에 작성된 명령인 경우 다른 안전한 방법(예: 배열 사용)이 있습니다.