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

时间:2019-01-09 11:43:12

标签: macos zsh shebang

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

#!/bin/bash

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

我有一个/ bin / bash二进制文件。

编辑:

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

. ~/.script.bash

2 个答案:

答案 0 :(得分:5)

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

. ~/.script.bash

这类似于

source ~/.script.bash

这意味着您的脚本是源文件,并且没有执行。您应该有类似的内容:

~/.script.bash
相反,它将在shebang定义的环境中执行。请注意,该文件必须是可执行文件。

  

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

     

来源:man zshall

答案 1 :(得分:2)

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

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

但是,当您执行Shell脚本时,执行将在子进程中进行。这意味着需要更改当前外壳程序/进程状态的操作将无法正常工作。像这样的东西:

  • 更改此shell的环境变量
  • 定义此shell的功能或别名
  • 更改此shell的工作目录
  • 更改此shell的ulimit
  • 依此类推

如果您需要执行此类操作,则别无选择,只能将bash脚本转换为zsh脚本,以便可以在zsh中“获取”该脚本。

相关问题