我在 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 是任何非空字符串,则将其替换为 textvalue 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
!