我有一个第三方脚本,它以这种形式接收命令行参数:
$ ./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,但没有成功。
当参数包含等号(模仿Bash行为)时,如何防止Zsh将我的论点包含在单引号中?
发布于 2020-10-22 14:45:33
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作为可视化工具插入。zsh和bash shell的跟踪输出格式略有不同,仅此而已。
如果您在从zsh shell运行脚本时遇到了问题,那么这些问题并不是因为shell修改了文件中的数据。
https://unix.stackexchange.com/questions/615831
复制相似问题