在我的 .bashrc
中,我定义了一个稍后可以在命令行上使用的函数:
function mycommand() {
ssh user@123.456.789.0 cd testdir;./test.sh "$1"
}
使用该命令时,只在远程主机上执行 cd
命令; test.sh
命令在本地主机上执行。这是因为分号分隔了两个不同的命令: ssh
命令和 test.sh
命令。
我尝试如下定义函数(注意单引号):
function mycommand() {
ssh user@123.456.789.0 'cd testdir;./test.sh "$1"'
}
我试图将 cd
命令和 test.sh
命令保持在一起,但是参数 $1
没有解决,与我给函数的内容无关。总是试图执行一个命令
./test.sh $1
在远程主机上。
如何正确定义 mycommand
,因此脚本 test.sh
在更改到目录后在远程主机上执行 testdir
,并能够传递参数给 mycommand
给 test.sh
?
原文由 Alex 发布,翻译遵循 CC BY-SA 4.0 许可协议
改为这样做:
您仍然必须将整个命令作为单个字符串传递,但在该单个字符串中,您需要
$1
在发送到 ssh 之前对其进行扩展,因此您需要使用""
对其.更新
实际上,另一种正确的方法是使用
printf %q
正确引用参数。即使参数包含空格、单引号、双引号或任何其他可能对 shell 具有特殊含义的字符,这也会使参数可以安全解析:function
声明函数时,不需要()
。从 Bash 4.4 版开始,也可以简化为:
请参阅 Shell Parameter Expansion 中的
${parameter@operator}
部分。