zsh 跟踪中出现意外的引号

zsh 跟踪中出现意外的引号

我有一个第三者以这种形式接收命令行参数的脚本:

$ ./script.sh --params a=123 b=456

有一个文件 xyz.txt,其内容如下:

c=3
d=4

我试图使用它的内容作为脚本的参数,但脚本抱怨没有收到正确的参数。当我这样做时set -x,我可以看到我的每个参数都用单引号引起来(因此第三方脚本无法处理它们)

$ set -x
$ ./script.sh --params $(cat xyz.txt)

....
+-zsh:20> cat xyz.txt
+-zsh:20> ./script.sh --params 'c=3' 'd=4'

在 bash 中尝试(也使用set -x),结果符合预期(没有单引号):

$ set -x
$ ./script.sh --params $(cat xyz.txt)

++ cat xyz.txt
+ ./script.sh --params c=3 d=4

如果文件中的值不包含等号,则不会出现此行为。例如

e-5
f-6

... 
+-zsh:20> ./script.sh --params e-5 f-6

我尝试禁用尽可能多的功能,setopt但没有成功。

当 Zsh 包含等号(模仿 Bash 行为)时,如何防止 Zsh 将我的参数括在单引号中?

答案1

shell 没有在参数中插入单引号。

证明:

$ cat file
c=3
d=4
$ printf 'Argument: >>%s<<\n' $(cat file)
Argument: >>c=3<<
Argument: >>d=4<<

这表明读取的两行file被正确地分成两个单独的参数并传递给printf实用程序,而无需添加单引号。

请注意,在以下情况下运行时输出不会改变set -x

$ set -x
$ printf 'Argument: >>%s<<\n' $(cat file)
+/usr/local/bin/zsh:11> cat file
+/usr/local/bin/zsh:11> printf 'Argument: >>%s<<\n' 'c=3' 'd=4'
Argument: >>c=3<<
Argument: >>d=4<<

单引号不是传递给脚本的参数的一部分。它们只是由 shell 作为视觉辅助插入,以用于跟踪输出(这是调试输出,不能用作或解释为 shell 的输入)。和shellzshbash跟踪输出格式略有不同,仅此而已。

如果您在从 shell 运行脚本时遇到问题zsh,那么这些问题并不是由于 shell 修改了文件中的数据造成的。

相关内容