In my .bashrc
我定义了一个稍后可以在命令行上使用的函数:
function mycommand() {
ssh [email protected] cd testdir;./test.sh "$1"
}
使用该命令时,只需cd
命令在远程主机上执行;这test.sh
命令在本地主机上执行。这是因为分号分隔了两个不同的命令:ssh
命令和test.sh
命令。
我尝试按如下方式定义函数(注意单引号):
function mycommand() {
ssh [email protected] 'cd testdir;./test.sh "$1"'
}
我试图保留cd
命令和test.sh
命令一起,但参数$1
没有解决,与我赋予该函数的内容无关。总是尝试执行命令
./test.sh $1
在远程主机上。
我如何正确定义mycommand
,所以脚本test.sh
切换到目录后在远程主机上执行testdir
,能够将论点传递给mycommand
to test.sh
?
这样做:
function mycommand {
ssh [email protected] "cd testdir;./test.sh \"$1\""
}
您仍然必须将整个命令作为单个字符串传递,但在该单个字符串中您需要$1
在发送到 ssh 之前已扩展,因此您需要使用""
for it.
Update
实际上执行此操作的另一种正确方法是使用printf %q
正确引用论点。这将使参数可以安全地解析,即使它包含空格、单引号、双引号或任何其他可能对 shell 有特殊含义的字符:
function mycommand {
printf -v __ %q "$1"
ssh [email protected] "cd testdir;./test.sh $__"
}
- 当声明一个函数时
function
, ()
没有必要。
- 不要仅仅因为你是 POSIXist 就对此发表评论。
从 Bash 4.4 版本开始,它还可以简化为:
function mycommand {
ssh [email protected] "cd testdir;./test.sh ${1@Q}"
}
See ${parameter@operator}
部分在外壳参数扩展.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)