在 zsh 中读取文件和 运行 命令

Read file and run command in zsh

所以我通常会创建包含命令列表的作业文件。然后我这样执行

cat jobFile | while read a; do $a; done

在 bash 中始终有效。但是,我刚刚开始在显然使用 zsh 的 Mac 中工作。此命令因“没有此类文件”等而失败。我已经通过运行手动测试了作业文件的几行,所以应该没问题。

我发现了有关 zsh 读入的问题,但它们往往是从变量中读入的,例如$a=('a' 'b' 'c') 或者 echo $a

感谢您的回答!

bash 中,未加引号的参数扩展总是进行分词,因此如果 a="foo bar",则 $a 扩展为两个词,foobar.作为命令,这意味着 运行 命令 foo 带有参数 bar.

zsh 中,参数扩展到 而不是 默认情况下会进行分词,这意味着相同的扩展 $a 会产生一个单词 foo bar,被视为要执行的命令的名称。

在任何一种情况下,依靠参数扩展来“解析”shell命令都是脆弱的;除了分词之外,扩展还受路径名扩展(通配符)的影响,您只能使用简单的命令及其参数。不允许管道、列表(&&||)或重定向,因为 所有内容 都将被视为命令名称和一系列参数。

你想要在 both shells 中简单地将你的作业文件视为一个 shell 脚本,它可以在当前 shell 使用 . 命令:

. jobFile

你为什么要用这么麻烦的方式执行它?假设 jobFile 是一个包含一系列 bash 命令的文件,您可以简单地 运行 将其作为

bash jobFile

如果它包含一系列 zsh 命令,您同样可以 运行 将其作为

zsh jobFile

如果您采用这种方法,我会在作业文件的名称中反映出 shell 它的用途,即

bash jobFile.bash
zsh jobFile.zsh

并且,如果您编写的作业文件应该与 shell 兼容,我会将其命名为 jobFile.sh.