我有一个第三者以这种形式接收命令行参数的脚本:
$ ./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 的输入)。和shellzsh
的bash
跟踪输出格式略有不同,仅此而已。
如果您在从 shell 运行脚本时遇到问题zsh
,那么这些问题并不是由于 shell 修改了文件中的数据造成的。