exec コマンドは bash に付属してくるコマンドです。
$ help exec exec: exec [-cl] [-a name] [command [arguments ...]] [redirection ...]
通常の使い方は…
てよりか読者も普段の作業で exec はあまり使うことがないと思います。
例えば /bin/echo を bash シェル内で叩くと、新たなプロセスが fork されます。別の言葉で言うと子プロセスをスポーン(spawn)します。
ところが exec /bin/echo を実行することは、現在使用中のシェルと /bin/echo を取り替えちゃいます。
ということはシェルの動いているターミナルを上書きして /bin/echo を実行するので、ターミナルも実行を停止しちゃいます。
難しめに言うと現在実行しているプロセスイメージを、コマンドのプロセスイメージに入れ替えるってことです。
単に引数の command で指定したコマンドを実行するだけと考えるのであれば eval コマンドを使った方が良いでしょうね。
でも現在使っているプロセスを破壊しておきたいなら使える感じです。
それで exec の使いどころとしては、引数の redirection を指定することでファイル記述子を開いたり、閉じたり、コピーできるところです。
つまりリダイレクトを指定するとファイル記述子の紐付けが可能となるってことです。
では例を見てみましょう。
$ echo "abc" > abc.txt $ exec 100< abc.txt $ read -u 100 str $ echo $str abc $ exec 100<&- $ read -u 100 str bash: read: 100: 無効なファイル記述子: 不正なファイル記述子です
この例は最もシンプルにしたつもりですが、それでも read コマンドを使うので少し難し目に感じられると思います。
では細かく見てみましょう。
$ echo "abc" > abc.txt $ exec 100< abc.txt
echo は「abc」を「abc.txt」に出力してます。
次に exec では abc.txt のファイル記述子を開いています。
「 100<ファイル名 」はファイルに対して読み込み専用のファイル記述子 100 を設定します。
「 < 」は読み込みなのですが「 > 」とすれば書き込みのファイル記述子にできます。
まあ、この辺は後の項目でもフォローアップします。
$ read -u 100 str $ echo $str abc
read コマンドの「 -u 」の次はファイル記述子を指定し str に読み込んだ行を保存します。
後は str 変数の中身を echo で表示しているだけですね。
$ exec 100<&-
この最後の行はファイル記述子 100 を閉じる効果があります。
$ read -u 100 str bash: read: 100: 無効なファイル記述子: 不正なファイル記述子です
最後のエラーは意図的に閉じたファイル記述子に対して不正なアクセスをしています。
エラーが出たということは、ファイル記述子が使えない状況になったということですね。
Copyright 2018-2019, by Masaki Komatsu