스크립트의 명령문에서 조건이 if
a를 사용하는 것을 보는데 $
그 이유를 이해할 수 없습니다.
if $( ssh user@host " test -e file " ); then
echo "File is there"
else
echo "We don't that file on that host"
fi
답변1
$(...)
명령 대체입니다. 쉘은 포함된 명령을 실행하고 표현식은 명령의 표준 출력으로 대체됩니다.
일반적으로 대체 텍스트에 쉘이 이후에 실행할 수 있는 명령의 이름이 지정되어 있지 않으면 오류가 생성됩니다. 그러나 test
출력이 생성되지 않으므로 결과는 셸이 "건너뛰는" 빈 문자열입니다. 예를 들어, 다음을 실행하면 어떻게 될지 생각해 보세요.
if $( ssh user@host " echo foo " ); then
echo "File is there"
else
echo "We don't that file on that host"
fi
주어진 코드는 불필요한 명령 대체 없이 올바르게 작성되었습니다. if
명령문에 필요한 유일한 것은 명령의 종료 상태입니다.
if ssh user@host "test -e file"; then
echo "File is there"
else
echo "We don't that file on that host"
fi
답변2
이 $( ... )
구성은 명령을 실행하고 명령의 종료 상태와 출력을 문자열로 반환합니다. 이것은 backtick 의 최신 버전입니다 `...`
.
다음과 같이 사용할 수 있습니다.my_id=$(id)
그러나 게시한 코드 조각은 손상된 코드입니다. ssh user@host "test -f file"
원격 호스트에 있는 파일의 존재를 기반으로 부울 값을 반환하는 것처럼 보이는 결과를 사용합니다 . 불행히도 ssh
자체적으로 실패할 수 있다는 점은 고려하지 않습니다 .
if $(ssh -q localhost true); then echo YES; else echo NO; fi
YES
if $(ssh -q localhost false); then echo YES; else echo NO; fi
NO
if $(ssh -q nowhere true); then echo YES; else echo NO; fi
ssh: Could not resolve hostname nowhere: Name or service not known
NO
어쩌면 이것은 의도적인 행동일지도 모르지만, 그럴지는 의심스럽습니다.
게다가 $( ... )
중복되므로 조건을 직접적으로 더 잘 표현할 수 있습니다.
if ssh -q user@host "test -e file"; then
echo "File is there"
else
echo "We don't [see] that file on that host [or the ssh failed]"
fi