主に使用するセットアップがあるいくつかの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 -xbash -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上記のように使用する場合、-eto などの引数を指定することはできませんbash(私の知る限り)。しかし、代わりにこれを行うことができます:
#!/usr/bin/env bash
set -e
env特にPythonを実行するスクリプトでpythonは、デフォルトがバージョン2と3のどちらであるかがわからず、特定のバージョンを必要とするスクリプトに大きな違いをもたらすため、使用法は特に良くありません。