Bash shebang 被忽略 - 脚本仍然使用 zsh 执行
Bash shebang is ignored - script is still executed with 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 ... ]
: Read commands from file
and execute them in the current shell environment.
source: man zshall
当您"source"一个脚本文件(即. <script-file-name>
)时,文件中的命令在当前shell中执行,使用当前shell的语法.文件中的任何 "shebang" 行都被解释为 shell 注释并被忽略。
如果你的脚本文件中的shell命令可以运行通过执行文件,你可以把它变成一个可执行文件,运行它作为一个命令。
然而,当您执行 shell 脚本时,执行发生在子进程中。这意味着需要改变当前 shell / 进程状态的东西将不起作用。像这样的东西:
- 更改此 shell 的环境变量
- 正在定义这个 shell 的函数或别名
- 正在更改此 shell 的工作目录
- 更改此 shell 的 ulimits
- 等等
如果你需要做那种事情,你别无选择,只能将你的 bash
脚本翻译成 zsh
脚本,这样你就可以 "source" 它在 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 ... ]
: Read commands fromfile
and execute them in the current shell environment.source:
man zshall
当您"source"一个脚本文件(即. <script-file-name>
)时,文件中的命令在当前shell中执行,使用当前shell的语法.文件中的任何 "shebang" 行都被解释为 shell 注释并被忽略。
如果你的脚本文件中的shell命令可以运行通过执行文件,你可以把它变成一个可执行文件,运行它作为一个命令。
然而,当您执行 shell 脚本时,执行发生在子进程中。这意味着需要改变当前 shell / 进程状态的东西将不起作用。像这样的东西:
- 更改此 shell 的环境变量
- 正在定义这个 shell 的函数或别名
- 正在更改此 shell 的工作目录
- 更改此 shell 的 ulimits
- 等等
如果你需要做那种事情,你别无选择,只能将你的 bash
脚本翻译成 zsh
脚本,这样你就可以 "source" 它在 zsh
.