ダミーのためのバッシュ・シバン?


36

主に使用するセットアップがあるいくつかのbashスクリプトがあります

#!/bin/bash

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

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

等々。

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


これらのオプションは、Bash(または他のインタープリター)に固有です。他のシェル(ダッシュやkshなど)でも同じかもしれませんが、AWKやPythonなどの他のインタープリターでは異なります。インタープリターが受け入れる多くのオプションを使用できます。オプションはインタープリター固有であり、シバンはカーネル機能です。
追って通知があるまで一時停止します。

回答:


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行には1つの引数しか移植できないことに注意してください。一部のユニックス(Linuxなど)は引数を1つしか受け入れないため、#!/bin/bash -e -xbash -e -xは2つの引数-eとではなく、単一の5文字の引数(構文エラー)を受け取ります-x

Bourneシェルshおよび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

2
@Caoilte:そして実際、彼らは(からですman bash): In 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

1
ああ!点滅して、あなたはそれを見逃します!:)。
Caoilte

0

私は、より優れた代替案を紹介したいと思います。

#!/usr/bin/env bash

上記の例ではenvbash実行可能ファイルを検索するために使用していますが、常に実行可能とは限りません/bin/bash。たとえば、古い#!/bin/bashスクリプトはNixOSでは動作しません。

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

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

2
私は常にこれを行いますが、「よりポータブル」だとは言いません。実際、ユーザーが完全に異なるもの(システムに同梱されていると想定できるもの)を実行させるリスクははるかに大きくなります。たとえば、Ubuntuはまだ船バッシュ4、ユーザーがバッシュ5を実行することを選択するかもしれないが
slhck

env特にPythonを実行するスクリプトでpythonは、デフォルトがバージョン2と3のどちらであるかがわからず、特定のバージョンを必要とするスクリプトに大きな違いをもたらすため、使用法は特に良くありません。
craft
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.