在 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
扩展为两个词,foo
和 bar
.作为命令,这意味着 运行 命令 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
.
所以我通常会创建包含命令列表的作业文件。然后我这样执行
cat jobFile | while read a; do $a; done
在 bash 中始终有效。但是,我刚刚开始在显然使用 zsh 的 Mac 中工作。此命令因“没有此类文件”等而失败。我已经通过运行手动测试了作业文件的几行,所以应该没问题。
我发现了有关 zsh 读入的问题,但它们往往是从变量中读入的,例如$a=('a' 'b' 'c') 或者 echo $a
感谢您的回答!
在 bash
中,未加引号的参数扩展总是进行分词,因此如果 a="foo bar"
,则 $a
扩展为两个词,foo
和 bar
.作为命令,这意味着 运行 命令 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
.