원격 SSH 명령을 실행하는 스크립트에서 작은따옴표를 큰따옴표로 묶을 때 오류가 발생하는 이유는 무엇입니까?

원격 SSH 명령을 실행하는 스크립트에서 작은따옴표를 큰따옴표로 묶을 때 오류가 발생하는 이유는 무엇입니까?

이 스크립트가 있습니다.

port=$1
cmd=$2
ssh [email protected] -p $port "'"$cmd"'"

실행할 때 myscript.sh 1000 "ls /dev/shm"다음 오류가 발생합니다 .

bash: ls /dev/shm: No such file or directory

스크립트에서 다음과 같은 명령을 에코하면(평가 방법을 확인하기 위해):

echo ssh [email protected] -p $port "'"$cmd"'"

알겠어요:

echo ssh [email protected] -p $port "'"$cmd"'"

올바른 명령은 무엇입니까? 그렇다면 여기서 무엇을 놓치고 있습니까?

감사해요.

답변1

내 문제에 대한 해결책을 찾았으므로 여기에 가이드가 있습니다.

올바르게 실행되지 않는 스크립트의 명령 문제를 해결하는 방법

또한 ~으로 알려진

쉘이 실행 중인 내용을 정확히 확인하는 방법

스크립트에서 문제가 되는 명령을 set 명령으로 묶습니다.

set -x #unhide debug info
your command
set +x #hide debug info

이전 예에서는 다음 port=1000과 같았습니다 cmd="ls /dev/shm".

ssh [email protected] -p $port "'"$cmd"'"

실제로 쉘로 전송되어 다음과 같이 실행됩니다.

ssh [email protected] -p 1000 ''\''ls' '/dev/shm'\'''

저것 봐! 이제 우리 모두는 큰 따옴표 ""가 실제로는 변장된 과잉 활성 양극 작은 따옴표라는 것을 알고 있습니다. 모퉁이를 돌아서 당신을 엉망으로 만들기를 기다리고 있습니다...때때로 Mr. Backslash 친구라는 사람을 데려옵니다.

해결책은 스크립트에서 큰따옴표를 사용하는 것입니다.

ssh [email protected] -p $port "$cmd"

명령줄에서 큰따옴표와 함께 사용하면 따옴표는 아래와 같이 작은따옴표 ' '로 변환되어 실행됩니다.

ssh [email protected] -p 1000 'ls /dev/shm'    

누가 알아! 너 그거 했니? 그것은 당신에게 좋습니다!

nix는 다른 방식으로 우리를 괴롭히고 있습니다 :P

관련 정보