リモート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

おすすめ記事