我在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
中"获取"它。