为什么我的变量不被尊重在这个ZSH脚本

  • 本文关键字:脚本 ZSH 变量 bash shell ssh zsh
  • 更新时间 :
  • 英文 :


我有这个shell脚本,我希望将CLI输入输入到SSH命令中。第一个SSH命令按预期运行,而第二个命令将runTests.sh的$1和$2设置为''。似乎没有把它们代入。为什么会这样呢?

$1=7107
$2=development
ssh redacted@redacted -t 'zsh -l -c "source ~/.zshrc && ./runTests.sh 7107 development"'
ssh redacted@redacted -t 'zsh -l -c "source ~/.zshrc && ./runTests.sh $1 $2"'

您正在调用三个不同的shell:本地shell、远程登录shell和远程zsh shell。您需要仔细指定哪一个应该负责哪一个参数替换。

您的变量位于本地shell中,但是您要求远程登录shell扩展它们。这就是它失败的原因。

下面是如何让本地shell替换它们的方法:

set -- 7107 development   # Assign $1 and $2
ssh redacted@redacted -t "zsh -l -c 'source ~/.zshrc && ./runTests.sh $1 $2'"

由于$1$2现在在本地shell中处于双引号中,它们展开,导致zsh -l -c 'source ~/.zshrc && ./runTests.sh 7107 development'在远程端。

这将导致在嵌套的zsh shell中出现source ~/.zshrc && ./runTests.sh 7107 development

理想情况下,您还希望转义数据中的特殊字符,以便带引号或空格的值正确工作:

ssh redacted@redacted -t "zsh -l -c 'source ~/.zshrc && ./runTests.sh $1 $2' _ $(printf %q "$1") $(printf %q "$2")"

$1, $2, $3, ...保留作为命令参数,例如,如果您的脚本名称是script.sh,当您运行:

./script.sh foo bar baz

$1foo,$2bar,$3baz

也不应该在赋值时使用空格。试一试:

foo=7107
bar=development
ssh redacted@redacted -t 'zsh -l -c "source ~/.zshrc && ./runTests.sh 7107 development"'
ssh redacted@redacted -t 'zsh -l -c "source ~/.zshrc && ./runTests.sh $foo $bar"'

请注意评论中指出的安全问题。

相关内容

  • 没有找到相关文章

最新更新