연결된 명령의 종료 상태

연결된 명령의 종료 상태

변수에서 유효하지 않은 명령을 실행하고 싶습니다 cmd. 나는 그것이 나를 실패하게 하고 종료 상태를 검색하도록 할 수 없습니다. 내가 시도할 수 있는 것은 파이프를 연결하는 것입니다. :그러면 성공적인 종료 상태를 얻게 됩니다.

$ $cmd | :
$ echo $?
0

cmd이제 단독으로 실행하지 않고 종료 상태를 알고 싶습니다 . Bash에서는 PIPESTATUS.

실행하려고 하는데 bash -c "$cmd | : ; rc=$(echo ${PIPESTATUS[@]} | head -c1)""잘못된 대체 오류"가 발생합니다.

내 질문은 다음과 같습니다

  1. 대시에서 첫 번째 명령의 종료 상태를 반환하는 목표를 달성하는 방법은 무엇입니까?
  2. 내가 무엇을 하고 있는데 대시 오류가 발생하나요?

답변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일반적인 쉘 명령 구문 분석이 적용되므로 놀라움이 줄어들 것이라고 생각합니다. 이것이 텍스트 파일에서 읽은 줄이 아닌 스크립트 내에 작성된 명령인 경우 다른 안전한 방법(예: 배열 사용)이 있습니다.

관련 정보