为什么在启动远程 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

刚刚找到解决问题的方法,所以这里是指南:

如何对脚本中无法正确执行的命令进行故障排除

又名

如何准确查看 shell 正在执行的内容

在脚本中,用 set 命令将有问题的命令括起来:

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

在我之前的例子中,是port=1000cmd="ls /dev/shm"

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

实际上被发送到 shell 并执行为:

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

看那个!现在我们都知道,双引号“”实际上是一个变相的过度活跃的双极单引号,只是在拐角处等着来扰乱你......有时它会带来一个叫做反斜杠先生的朋友。

解决方案是在脚本中使用双引号:

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

当与命令行中的双引号结合使用时,引用将被翻译并作为单引号 ' ' 执行,如下所示:

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

谁知道!你做到了吗?对你有好处!

nix 又用另一种方式来扰乱我们了 :P

相关内容