【发布时间】:2021-01-12 16:12:13
【问题描述】:
所以我通常会创建包含命令列表的作业文件。然后我就这样执行它
cat jobFile | while read a; do $a; done
这在 bash 中总是有效的。但是,我刚刚开始在显然使用 zsh 的 Mac 上工作。这个命令失败了,“没有这样的文件”等等。我已经通过手动运行几行来测试作业文件,所以应该没问题。
我发现有关 zsh 读取的问题,但它们往往是从变量中读取的,例如$a=('a' 'b' 'c') 或 echo $a
感谢您的回答!
【问题讨论】:
-
如果是命令列表,您应该在
bash和zsh中都使用. jobFile。您可能被zsh默认情况下不对未引用的参数扩展执行分词这一事实所困扰。如果a="foo bar",则$a尝试运行名为foo bar的命令,而不是名为foo的带有参数bar的命令。 -
感谢您的回复@chepner。你能详细说明一下吗?你是什么意思只使用
. jobFile?您的意思是删除 cat 命令并使用 .相反还是别的什么?你能举个例子吗?对不起,noobishness! -
您似乎假设文件的每一行都是一个完整的 shell 命令,在这种情况下,文件本身就是一个 shell 脚本。
. jobFile完全符合您的要求:它一个接一个地执行每个命令,但您让 shell 正确解析和评估每个命令,而不是依赖于参数扩展技巧。 -
@chepner 哦,好的,我现在知道了!谢谢!基本上只是直接将其作为 shell 脚本执行。谢谢!
-
仅仅因为 Mac 使用
zsh作为其默认的交互式 shell,并不意味着您必须在脚本中使用它。将#!/bin/bash放在脚本的开头,它将使用bash。