【问题标题】:Bash shebang is ignored - script is still executed with zshBash shebang 被忽略 - 脚本仍然使用 zsh 执行
【发布时间】:2019-01-09 11:43:12
【问题描述】:

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

#!/bin/bash

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

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

编辑:

~/.zprofile 执行脚本如下:

. ~/.script.bash

【问题讨论】:

  • 根据bash reference manual 上的SHELLIf it is not set when the shell starts, Bash assigns to it the full pathname of the current user’s login shell. 所以,仅仅因为/bin/zsh 被回显并不意味着它是zsh 执行脚本。你是如何执行.zprofile中的脚本的?
  • @cody 是的。我只是将终端的 shell 设置为不同的东西(但将 zsh 保留为默认值),即使这次实际使用了 bash,$SHELL 仍然是 zsh。我会将脚本的执行位添加到问题中。
  • @cody 我编辑了问题以解决实际问题,省略了 $SHELL 部分。
  • CVers - 这不是错字;拼写错误是无意的错误,如果 OP 尝试更仔细地重新输入相同的内容,则不会重复。这是故意这样写的。

标签: macos zsh shebang


【解决方案1】:

您在~/.zprofile 中写了以下行:

. ~/.script.bash

这类似于

source ~/.script.bash

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

~/.script.bash

而是在 shebang 定义的环境中执行。请注意,该文件必须是可执行的。

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

来源:man zshall

【讨论】:

  • 这个的另一面是如果脚本确实需要被获取(为当前会话设置shell或环境变量),那么它需要写在@ 987654328@,不是bash,而且不需要shebang。
【解决方案2】:

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

如果你的脚本文件中的shell命令可以通过执行文件来运行,你可以把它做成可执行文件,作为命令运行。

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

  • 更改此 shell 的环境变量
  • 定义此 shell 的函数或别名
  • 更改此 shell 的工作目录
  • 更改此 shell 的 ulimits
  • 等等

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-08
    • 2012-08-07
    • 2011-09-20
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    相关资源
    最近更新 更多