】コマンド(応用編1)——ファイルの上書きやシェルの終了、ジョブ終了後の通知動作を変更する本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、シェルの設定を確認、変更する「set」コマンドです。本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回はシェルの設定を確認、変更する「set」コマンドです。実行例リダイレクトで既存のファイルを上書きしない[CTRL]+[D]ですぐにログアウトしない終了したバックグラウンドジョブの結果をすぐに表示するsetコマンドとは?「set」はシェルの設定を確認、変更するコマンドです。setはbashのビルトインコマンド(シェルの組み込みコマンド)です(※1)。このためmanコマンドではなく、helpコマンドで詳細を表示できます。setコマンドの基本的な使い方については、連載第205回をご確認ください。tcshなど、他のシェルにも同名のコマンドがある。今回は、setコマンドのオプションのうち、よく使われる2つを取り上げます。リダイレクトで既存のファイルを上書きしない「noclobber」オプションと、[CTRL]+[D]でログアウトしない「ignoreeof」オプション、終了したバックグラウンドジョブの結果をすぐに表示する「notify」オプションです。次回は定義されていない変数を参照したらエラーにするnounsetオプションと、コマンドが実行時にエラーになった場合、直ちにシェルを終了する「errexit」オプションを取り上げます。]は省略可能な引数を示しています。allexport」と同じ効果を持つ。allexport」相当だ。他のシェルオプションについても同様。トレース情報として、シェルが実行したコマンドとその引数を出力する。シェルスクリプトの文法チェックをする際に使用する。対話シェルでは無視する。目次に戻るリダイレクトで既存のファイルを上書きしないリダイレクトでコマンドの出力をファイルに保存する際、注意することが1つあります。ファイル」のように「>」記号1つでリダイレクトした場合、ファイルを常に新規で作成します(※4)。既存のファイルがあった場合、上書きされてしまいます。ファイル」のように「>」記号2つでリダイレクトした場合、既存ファイルの末尾に追加される。指定したファイルがない場合は新規で作成される。-C」で、「noclobber」オプションを有効にして、ファイルの上書きを禁止できます(画面1)。自分のコマンドラインでは常にこのように設定したい場合は、「~/.bashrc」に書いておくとよいでしょう。-C」を実行してsetコマンドの「noclobber」オプションを有効にしても、シェルスクリプトの実行には影響がありません。シェルスクリプトではbashが別途起動しているためです(画面2)。-C」を設定した場合でも、シェルスクリプトには影響がありません。シェルスクリプトで起動するbashは、非対話シェルなので設定ファイル(~/.bashrc)を読み込まないためです(※5)。bashは、ログインシェルの場合は起動時に/etc/profileと~/.bash_profileを読み込み、対話シェルの場合はさらに~/.bashrcも読み込む。/etc/bashrcも使用するように設定されていることが少なくないが、その場合でも/etc/bashrcの中で非対話シェルの場合は処理を行わない設定になっていることが多い。スクリプトの中で上書きを禁止したい場合は、「>」ではなく「>>」でファイルに追記するように記述しておくか、スクリプトの処理として事前にファイルの存在を確認する方法が一般的です。リダイレクトで既存のファイルを上書きすることを禁止しても、シェルスクリプトからは上書きされてしまう目次に戻る[CTRL]+[D]ですぐにログアウトしないbashをログアウトする場合や、仮想端末を終了させる場合には、[CTRL]+[D]というキー入力を実行します。File)を出力するキー操作です。bashはEOFを受け取るとログアウトします。ignoreeof」でsetコマンドの「ignoreeof」オプションを有効にします。このようにすると、bashはEOFを受け取ってもログアウトしません。「ignoreeof」オプションの意味はデフォルトでは「EOFを連続10回無視する」というものです。このため、[CTRL]+[D]を連続して入力すると11回目にログアウトします(画面3)。回数を変更したい場合は、シェル変数IGNOREEOFに回数を設定します(画面4)。11回目にはログアウトする。[CTRL]+[D]を受け付ける回数を変更したところ目次に戻る終了したバックグラウンドジョブの結果をすぐに表示するバックグラウンドジョブの結果は、ジョブが終了した直後には表示されません。結果が表示されるのは、コマンドラインで次のコマンドを実行したタイミングです(画面5、関連記事)。-b」で、setコマンドの「notify」オプションを有効にします(画面6)。画面5ではsleepコマンド(第66回)をバックグラウンドで実行しています。これは指定した秒数だけ待機して終了するだけのコマンドです。続けて実行しているのはdateコマンド(第77回)で、実行したタイミングの日時を表示して経過時間を確認しています。バックグラウンドジョブの結果が、終了後、即座に表示されたなお、バックグラウンドジョブの終了が通知されるのは、setコマンドのmonitorオプションがデフォルトで有効になっているためです。+m」でmonitorオプションを無効にすることで、終了が通知されなくなります(画面7)。めぐみ)PC-9801NからのDOSユーザー。toolsを経てLinuxへ。1992年より生産管理のパッケージソフトウェアの開発およびサポート業務を担当。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『Accessではじめるデータベース超入門[改訂2版]』『macOSコマンド入門』など。Reserved.ページトップに戻る。