![원격 SSH 명령을 실행하는 스크립트에서 작은따옴표를 큰따옴표로 묶을 때 오류가 발생하는 이유는 무엇입니까?](https://linux55.com/image/56215/%EC%9B%90%EA%B2%A9%20SSH%20%EB%AA%85%EB%A0%B9%EC%9D%84%20%EC%8B%A4%ED%96%89%ED%95%98%EB%8A%94%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90%EC%84%9C%20%EC%9E%91%EC%9D%80%EB%94%B0%EC%98%B4%ED%91%9C%EB%A5%BC%20%ED%81%B0%EB%94%B0%EC%98%B4%ED%91%9C%EB%A1%9C%20%EB%AC%B6%EC%9D%84%20%EB%95%8C%20%EC%98%A4%EB%A5%98%EA%B0%80%20%EB%B0%9C%EC%83%9D%ED%95%98%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
이 스크립트가 있습니다.
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