私が使用しているbashスクリプトがいくつかあります。
#!/bin/bash
しかし、私は定期的に次のようなものに出くわします
#!/bin/bash -e
#!/bin/bash -x
#!/bin/bash -ex
等々。
誰かがこれらのシバンオプションの意味と利点、およびそれらが他のシバンに適用されるかどうかを説明できますか?
スクリプト/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.
私は、より移植性のある、より良い代替案について言及したいと思います。
#!/usr/bin/env bash
上記の例では、env
を使用してbash
実行可能ファイルを検索していますが、これは常に/bin/bash
にあるとは限りません。古い#!/bin/bash
スクリプトは NixOS などでは機能しません。
上記で示したようにenv
を使用する場合、-e
からbash
までの引数を指定することはできません(私の知る限り)。しかし、代わりにこれを行うことができます:
#!/usr/bin/env bash
set -e