if $( ssh user@host " [ -e file ] " )의 "if $"는 무엇을 의미합니까? 그 다음에...?

if $( ssh user@host " [ -e file ] " )의 "if $"는 무엇을 의미합니까? 그 다음에...?

스크립트의 명령문에서 조건이 ifa를 사용하는 것을 보는데 $ 그 이유를 이해할 수 없습니다.

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

답변3

이를 $(command)명령 대체라고 합니다(POSIX 사양 참조).여기그리고 배쉬 매뉴얼여기). 이는 명령을 실행하고 해당 출력을 다른 명령에 전달하는 방법입니다. 동일 `command`하지만 이 $(...)구문은 명령을 중첩하기 쉽고 더 읽기 쉬운 코드를 생성하므로 선호됩니다.

예를 들어:

$ echo $(echo "bar")
bar

위 명령은 echo "bar"(즉 bar)의 출력을 외부로 파이프합니다 echo.

관련 정보