在 zsh 中,如何运行为 bash 编写的脚本

mic*_*ael 10 bash zsh

我已切换到 zsh,如何运行为 bash 编写的脚本?

我不想修改脚本以将 #!/bin/bash 放在脚本的开头,因为它是受版本控制的。

还有其他方法吗?

有问题的脚本行是:

for f in `/bin/ls v/*/s.sh v/*/*/v.sh d/*/*/v.sh 2> /dev/null`
Run Code Online (Sandbox Code Playgroud)

nee*_*ted 27

您可以手动使用 bash 运行脚本:

bash myscript.sh
Run Code Online (Sandbox Code Playgroud)

更好、更持久的解决方案是添加一条 shebang 行:

#!/usr/bin/env bash
Run Code Online (Sandbox Code Playgroud)

添加该行后,即使在 ZShell 中,您也可以直接运行它:

% ./myscript.sh
Run Code Online (Sandbox Code Playgroud)

就版本控制而言,为了所有相关开发人员的利益,您应该提交这一行。

  • 同意——一个需要 bash 但不以 bash shebang 开头的脚本应该被认为是坏的。并且应该修复损坏的脚本。(尽管正如@gniourf_gniourf 指出的那样,这并不是这里唯一的问题。) (4认同)
  • 只要我们讨论的是 shebangs 的主题:为什么不更正为“#!/usr/bin/env bash”。这样脚本就可以在更多系统上运行。 (/usr/local/bin/bash、/usr/bin/bash 等都是硬编码的,您需要为您使用的每个 shell 修复每个脚本。使用 env 您只需维护一个程序)。 (3认同)

小智 9

除了@neersighted评论的解决方案之外,您还应该确保您的bash脚本具有在zsh. 因此,您应该首先使用 shabang 设置 bash 脚本的第一行:

#!/usr/bin/env bash
Run Code Online (Sandbox Code Playgroud)

然后运行:

% chmod +x myscript.sh
Run Code Online (Sandbox Code Playgroud)

提供此类许可。然后你可以运行它zsh

% ./myscript.sh
Run Code Online (Sandbox Code Playgroud)

  • 节省了我很多时间 (2认同)
  • 未来我会在某个时候回到这里。.. (2认同)