Bash シェルで set を使用する

Niraj Menon 2023年1月30日
  1. Bash で set -x を使用したコマンドトレース
  2. Bash の set の他の便利なオプション
Bash シェルで set を使用する

Bash シェルには、現在実行中のシェルセッションの環境を操作するための便利な組み込みコマンドがいくつか含まれています。組み込みの set コマンドは、シェル環境変数とオプションを表示および変更する機能を提供します。

このチュートリアルでは、set コマンドの使用範囲と、適切な環境オプションを設定するための Bash スクリプトを効果的に作成する方法について説明します。

Bash で set -x を使用したコマンドトレース

デフォルトでは、set コマンドを単独で実行すると、Bash 実行可能ファイルの場所、バージョン情報、PATH などの環境変数を含む、現在設定されている変数とその値のリストが返されます。

コマンドの使用は、実行されたコマンドを表示するときです。プログラマーの場合、これは Bash スクリプトをデバッグして、特定のコマンドで失敗していないかどうかを確認するのに役立ちます。

これを行うには、set -x または set -o xtrace を実行します。これにより、コマンドトレースがオンになります。コマンド自体は何も出力しませんが、後続のコマンドは実行直前に出力されます。コマンドで中括弧の拡張(最近の Bash 機能)を使用すると便利です。

番号付きの TXT ファイルを削除するコマンドがある場合、set コマンドトレースを有効にすると、そのディレクトリ内のすべての TXT ファイルを含む中括弧の拡張形式が表示されます。

user@linux:~$ set -x
user@linux:~$ cd /tmp
+ cd /tmp
user@linux:~$ # example of expansion (and comments do not print out in traces)
user@linux:~$ touch {1..5}.txt
+ touch 1.txt 2.txt 3.txt 4.txt 5.txt
user@linux:~$ rm -f *.txt
+ rm -f *.txt
user@linux:~$ # however, asterisk globs do not expand.

Bash の set の他の便利なオプション

set コマンドは、コマンドを実行しない、コマンドラインを Emacs スタイルのエディターに変更する、エラーが発生したときにバックトレースを出力するなど、コマンドトレースと同様のシェル操作のための相互に排他的なオプションを多数提供します。

オプションをオンにするには、set -o <option_name>set +o <option_name> を使用してオフにする必要があることに注意してください。

これらのオプションの完全なリストは、組み込みのセットの GNU マニュアルから提供された情報とともに、以下で説明されています。

  1. allexport - 環境変数を設定する Bash スクリプトがあり、それらの変数を現在のシェルと後続のサブシェルで使用できるようにする場合、set -a または set -o allexport によってこれらの変数が発生します。エクスポートされ、それらのシェルコンテキストで使用できるようになる変数。
  2. braceexpand - ブレース展開を使用すると、数値のペアの定数セットを、それらの数値の範囲のスペースで区切られた文字列に展開できます。これをオフにすると、シェルでより低いコマンドで中括弧を評価する場合に、中括弧の拡張が無効になります。
  3. Emacs - コマンドラインで emacs ベースの編集を可能にします。
  4. errexit - Bash スクリプトのコマンドがゼロ以外のステータスコードで終了すると、スクリプト全体が停止します。これは、失敗したコマンドとゼロ終了コードを返す 2 番目のコマンドの OR をとって、スクリプトが途中で終了するのを防ぐことで防ぐことができます。
  5. errtrace - プログラムがゼロ以外のステータスコードで終了した場合、失敗したコマンドへのバックトレースが出力されます。
  6. hashall - 環境 PATH でコマンドの場所が検索されたときに、コマンドの場所を追跡します。検索と実行を高速化するために、コマンドパスを 1つの場所にキャッシュします。
  7. histexpand - !を展開します履歴置換機能としての文字列内の文字。!の使用に問題がある場合文字列内の文字であり、履歴置換作業をあまり行わない場合は、これを安全にオフにすることができます。
  8. 履歴 - これは、以前に実行されたコマンドのリストを維持できるようにする重要な機能です。
  9. ignoreeof - EOF 文字(Ctrl-D で提供)は通常、Bash シェルまたは入力を受け入れるコマンドを終了します。このオプションを無効にすると、EOF が無視され、EOF のみを受け入れる一部のコマンドが破損する可能性があります。
    10. モニター-ジョブ制御を有効にし、バックグラウンドで実行されるプロセスが実行を完了すると、終了コードを出力します。終了時にバックグラウンドプロセスを確認すると便利です。
    11.noclobber->&、<> などの Bash リダイレクトユーティリティが既存のファイルを切り捨てないようにします。テスト中に実際のログファイルを処理していて、既存のログを誤って削除したくない場合に便利です。
    12.noexec-コマンドを出力しますが、実行しません。スクリプトで使用する場合、noexec は特定のコマンドをスキップし、特定のポイントでオンとオフを切り替えることで他のコマンドを実行できます。
    13.noglob-グロブ(つまり* .txt)の拡大を防ぎます。
    14.通知- モニターと併用すると、通知は次のシェルプロンプトを待つのではなく、バックグラウンドジョブのステータスコードをすぐに出力します。
    15.nounset-変数が設定されておらず、その値を読み取ろうとした場合にエラーコードを返します。
    16.onecmd-次のコマンドを読み取って実行した後、終了します。

その他のオプションは上記のマニュアルに記載されていますので、お読みになりたい方はそちらをご覧ください。これらのオプションが Bash プログラミングエクスペリエンスを向上させることができます。

これらのオプションについてコマンドラインからもう一度読みたい場合は、help set を実行してみてください。set コマンドの詳細については、Linux DocumentationProject のページもお勧めします。