我有这个脚本:
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=1000
和cmd="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