Bash Shebang的假人?


36

我有一些bash脚本,我的设置大部分使用

#!/bin/bash

但我经常遇到一些看起来像

#!/bin/bash -e
#!/bin/bash -x
#!/bin/bash -ex

等等。

有人可以解释这些shebang选项的含义和好处,以及它们是否适用于其他shebang?


这些选项特定于Bash(或其他解释器)。对于其他shell(例如,破折号和ksh),它们可能是相同的,但是对于其他解释器,例如AWK和Python,它们将有所不同。您可以使用解释器接受的许多选项。这些选项是特定于解释器的,而shebang是内核功能。
暂停,直到另行通知。

Answers:


41

如果脚本/path/to/foo以开头#!/bin/bash,则执行/path/to/foo arg1 arg2等同于执行/bin/bash /path/too/foo arg1 arg2。如果shebang行是#!/bin/bash -ex,则等效于执行/bin/bash -ex /path/too/foo arg1 arg2。此功能由内核管理。

请注意,在shebang行上您只能移植一个参数:某些unices(例如Linux)仅接受一个参数,因此这#!/bin/bash -e -x将导致bash接收单个五个字符的参数-e -x(语法错误),而不是两个参数-eand -x

对于Bourne Shell sh和派生Shell(例如POSIX sh,bash,ksh和zsh):

  • -e 表示如果任何命令失败(通过返回非零状态表示),脚本将立即终止。
  • -x 使外壳程序打印执行跟踪。

其他程序可能会理解这些选项,但含义不同。


24

它们是传递给您的选项,以bash查看help set更多信息,在这种情况下:

-x  Print commands and their arguments as they are executed.
-e  Exit immediately if a command exits with a non-zero status.

3
+1和-ex同时做两
Nifle

令人困惑,因为它们看起来像是传递给Bash的命令行选项。
Caoilte 2012年

2
@Caoilte:事实上他们是(从man bashIn addition to the single-character shell options documented in the description of the set builtin command, bash interprets the following options when it is invoked: [...]
cyrus 2012年

1
啊!眨眼,你想念它!:)。
Caoilte 2012年

0

我只想提及一种更好的方法(如便携式方法):

#!/usr/bin/env bash

上面的示例env用于查找bash可执行文件,该可执行文件并不总是位于/bin/bash。例如,老式#!/bin/bash脚本在NixOS不起作用

如果env按照上面的说明使用,就无法提供诸如-eto 的参数bash(据我所知)。但是您可以改为:

#!/usr/bin/env bash
set -e

2
我一直在这样做,但我不会说它“更便携”-实际上,让用户运行完全不同的东西(与您可以假定的系统附带的东西)的风险要大得多。例如,Ubuntu的仍然船舶击4,而用户可以选择运行击5
slhck

是的,env尤其是对于运行python的脚本,用法并不理想,因为您根本不知道默认python版本是2还是3,因此对于需要特定版本的脚本而言,差异很大。明确而不是狡猾
smac89
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.