의 종료 상태 여부를 당신의 명령은 성공 또는 실패를 나타내며 대괄호를 완전히 버립니다. 그 유스 케이스에서 test
명령을 사용하는 것은 잘못되어 완전히 멈춘다. 이 경우
,
if foo "$param1" "$param2"; then ...; fi
불필요 비효율적 유일한 올바른 구문이다. 그것은 당신의 서브 프로세스 내부 $?
을 방출하고, 그 사용 test
의 출력을 확인,과 같이 할 확실히 수있어
:
if [ "$(foo "$param1" "$param2" >&2; echo "$?")" -eq 2 ]; then ...; fi
... 그러나 다시보고 다시 "불필요하게 비효율적" ; 이것은 다음과 같이 작성하는 것이 더 낫습니다.
foo "$param1" "$param2"; retval=$?
if [ $retval -eq 2 ]; then ...; fi
... 불필요한 서브 쉘의 모든 오버 헤드를 피하십시오.
당신은 당신의 명령의 출력 표준 UNIX는 그들이 무엇인지 찾을 수 있는지, 제대로 작동 여부를 표시 할 수 있습니다 명령을 대부분으로, 바람직하지 않은/불필요한 동작을 일반적으로 (비 비어 있는지 여부를 테스트하려면 종료 상태를 통해 검색하는 등의 작업) :
if [ -n "$(foo "$param1" "$param2")" ]; then ...; fi
이 맞습니다. 명심해야 할
하나 개 중요한 것은 - $()
의 사용은 부모 쉘 (및 업데이트 또는 쉘의 상태를 수정하는 것이 가능) 서브 쉘로의 내부 실행 함수를 이동합니다. 따라서 함수가 변수 또는 상태를 쉘 내부에서 변경해야하는 경우 $()
을 사용하면 함수가 수정됩니다.
명령의 출력 코드 또는 반환 할 내용은 무엇입니까? – fedorqui
(종료 상태를 사용하여) 대괄호없이 작동하는 경우,'test' 명령으로 실행할 필요가 없습니다. – chepner
** 왜'test'에서 ** 사용 하시겠습니까? 종료 상태가 아닌 출력을 내보내는 지 테스트하려고합니까? –