在 macos 中运行脚本的默认 shell (w/o shebang)?

在 macos 中运行脚本的默认 shell (w/o shebang)?

我在 MacOS 中将 ZSH 用作默认 shell,一切运行正常。ZSH 是作为 brew 包安装的,我已在帐户中设置了默认 shell,新 shell 已在/etc/shells...中列出,一切设置完毕,正如我所说的。

我有一些 shell 脚本,其中使用了一些来自 zsh 的命令,例如print。当我从命令行执行脚本时,命令print无法识别,脚本失败。

这个脚本确实不是有 shebang 行。当我为 zsh 放置 shebang 行时,一切正常;命令print正在运行。

由于我只使用 ZSH,是否可以设置默认 shell运行脚本,所以我不必在我的 .zsh 脚本中放入 shebang 行?

或者是否可以将.zsh扩展与 ZSH shell 执行关联起来?

答案1

Z壳如果/bin/sh你运行一个没有 shebang 行的可执行脚本(请参阅man zshmisc命令执行部分或查看这个答案以获得完整列表)。这似乎是硬编码的。因此,如果您不想使用 unix 方式(添加 shebang 行),您可以使用所谓的后缀别名在 Z shell 中使用特定程序执行具有特定扩展名的所有文件。在您的案例中

alias -s zsh=zsh

应该可以解决问题。一般形式是(因为上面的例子不太清楚):

alias -s extension=program

手册页解释了这是如何工作的:

如果存在 -s 标志,则定义后缀别名:如果命令行上的命令字采用 形式text.name,其中 text 是任何非空字符串,则将其替换为 text value text.name。请注意, name 被视为文字字符串,而不是模式。

在这种情况下,值中的尾随空格并不特殊。例如,

alias -s ps=gv

将导致命令*.ps扩展为gv *.ps。由于别名扩展比通配符更早执行,因此*.ps将随后扩展 。后缀别名与其他别名构成不同的名称空间(因此在上面的示例中,仍然可以为命令 ps 创建别名),并且这两个集合永远不会一起列出。


如果你想使用位于某处的脚本$PATH,请使用

alias -s zsh="zsh -o PATH_SCRIPT"

这将启用该选项PATH_SCRIPT

如果设置了选项 PATH_SCRIPT,并且文件名不包含目录路径(即名称中没有“/”),则首先在当前目录中搜索脚本,然后在变量 PATH 给出的命令路径中搜索脚本。

.请注意,即使不在您的目录中,也会在当前目录中搜索脚本PATH

相关内容