이 스크립트가 있습니다.
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