web-dev-qa-db-ja.com

ダミーのためのBash Shebang?

私が使用しているbashスクリプトがいくつかあります。

#!/bin/bash

しかし、私は定期的に次のようなものに出くわします

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

等々。

誰かがこれらのシバンオプションの意味と利点、およびそれらが他のシバンに適用されるかどうかを説明できますか?

38
coneybeare

スクリプト/path/to/foo#!/bin/bashで始まる場合、/path/to/foo arg1 arg2の実行は/bin/bash /path/too/foo arg1 arg2の実行と同等です。シバン行が#!/bin/bash -exの場合、/bin/bash -ex /path/too/foo arg1 arg2を実行することと同じです。この機能はカーネルによって管理されます。

Shebang行には引数を1つしか持てないことに注意してください。一部のunice(Linuxなど)は引数を1つしか受け入れないため、#!/bin/bash -e -xは、bashが単一の5文字の引数-e -x( 2つの引数-eおよび-xではなく、構文エラー)。

Bourne Shell shおよびPOSIX sh、bash、ksh、zshなどの派生シェルの場合:

  • -eは、コマンドが失敗した場合(ゼロ以外のステータスを返すことで示される)、スクリプトがすぐに終了することを意味します。
  • -xを指定すると、シェルは実行トレースを出力します。

他のプログラムはこれらのオプションを理解するかもしれませんが、意味が異なります。

これらは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.
24
cYrus

私は、より移植性のある、より良い代替案について言及したいと思います。

#!/usr/bin/env bash

上記の例では、envを使用してbash実行可能ファイルを検索していますが、これは常に/bin/bashにあるとは限りません。古い#!/bin/bashスクリプトは NixOS などでは機能しません。

上記で示したようにenvを使用する場合、-eからbashまでの引数を指定することはできません(私の知る限り)。しかし、代わりにこれを行うことができます:

#!/usr/bin/env bash
set -e
0
Simon Alling