首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >zsh跟踪中的意外引号

zsh跟踪中的意外引号
EN

Unix & Linux用户
提问于 2020-10-22 11:59:14
回答 1查看 202关注 0票数 -1

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

代码语言:javascript
复制
$ ./script.sh --params a=123 b=456

有一个包含以下内容的文件xyz.txt:

代码语言:javascript
复制
c=3
d=4

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

代码语言:javascript
复制
$ 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),结果如预期(没有单引号):

代码语言:javascript
复制
$ set -x
$ ./script.sh --params $(cat xyz.txt)

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

如果文件中的值不包含等号,则不存在此行为。例如。

代码语言:javascript
复制
e-5
f-6

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

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

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

EN

回答 1

Unix & Linux用户

发布于 2020-10-22 14:45:33

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

证明:

代码语言:javascript
复制
$ cat file
c=3
d=4
$ printf 'Argument: >>%s<<\n' $(cat file)
Argument: >>c=3<<
Argument: >>d=4<<

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

注意在set -x下运行时输出是如何不改变的:

代码语言:javascript
复制
$ 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作为可视化工具插入。zshbash shell的跟踪输出格式略有不同,仅此而已。

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

票数 3
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/615831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档