Bash shebang 被忽略 - 脚本仍然使用 zsh 执行



我在Mac OSX上有一个脚本,该脚本在打开新终端时执行。它在 .zprofile 中指定。它有一个 bash shebang,但它仍然使用 zsh(我的默认 shell)执行。这里可能有什么问题?

#!/bin/bash

核心问题是由于 zsh 语法的差异,我无法执行脚本。当我分析可能导致这种情况的原因时,我意识到shebang只是被忽略了。

顺便说一句,我有一个二进制/bin/bash。

编辑:

~/.zprofile像这样执行脚本:

. ~/.script.bash

你写了~/.zprofile以下行:

. ~/.script.bash

这类似于

source ~/.script.bash

这意味着您的脚本是源的,而不是执行的。你应该有这样的东西:

~/.script.bash

相反,它将在Shebang定义的环境中执行。请注意,该文件必须是可执行的。

. file [ arg ... ]file读取命令并在当前 shell 环境中执行它们。

来源: man zshall

当您"源"脚本文件(即 . <script-file-name> ) 文件中的命令使用当前 shell 的语法在当前 shell 中执行。 文件中的任何"shebang"行都会被解释为 shell 注释并被忽略。

如果脚本文件中的 shell 命令可以通过执行文件来运行,则可以将其设置为可执行文件并将其作为命令运行。

但是,当您执行 shell 脚本时,执行发生在子进程中。 这意味着需要更改当前 shell/进程状态的东西将不起作用。 像这样的事情:

  • 更改此外壳的环境变量
  • 定义此外壳的功能或别名
  • 更改此外壳的工作目录
  • 更改此外壳的 ulimit
  • 等等

如果您需要做这种事情,您别无选择,只能将bash脚本转换为zsh脚本,以便您可以在zsh中"获取"它。

最新更新