主に使用するセットアップがあるいくつかのbashスクリプトがあります
#!/bin/bash
しかし、私は定期的にいくつかのようなものに出くわします
#!/bin/bash -e
#!/bin/bash -x
#!/bin/bash -ex
等々。
誰かがこれらのシバンオプションの意味と利点、およびそれらが他のシバンに適用されるかどうかを説明できますか?
主に使用するセットアップがあるいくつかの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
です。shebang行がの場合#!/bin/bash -ex
、それは実行と同等/bin/bash -ex /path/too/foo arg1 arg2
です。この機能はカーネルによって管理されます。
shebang行には1つの引数しか移植できないことに注意してください。一部のユニックス(Linuxなど)は引数を1つしか受け入れないため、#!/bin/bash -e -x
bash -e -x
は2つの引数-e
とではなく、単一の5文字の引数(構文エラー)を受け取ります-x
。
Bourneシェルsh
およびPOSIX sh、bash、ksh、zshなどの派生シェルの場合:
-e
コマンドが失敗した場合(ゼロ以外のステータスを返すことで示す)、スクリプトはすぐに終了することを意味します。-x
シェルに実行トレースを出力させます。他のプログラムはこれらのオプションを理解しますが、意味は異なります。
私は、より優れた代替案を紹介したいと思います。
#!/usr/bin/env bash
上記の例ではenv
、bash
実行可能ファイルを検索するために使用していますが、常に実行可能とは限りません/bin/bash
。たとえば、古い#!/bin/bash
スクリプトはNixOSでは動作しません。
env
上記のように使用する場合、-e
to などの引数を指定することはできませんbash
(私の知る限り)。しかし、代わりにこれを行うことができます:
#!/usr/bin/env bash
set -e
env
特にPythonを実行するスクリプトでpython
は、デフォルトがバージョン2と3のどちらであるかがわからず、特定のバージョンを必要とするスクリプトに大きな違いをもたらすため、使用法は特に良くありません。