シェルスクリプトでの exec コマンドの用途は何ですか? [closed] 質問する

シェルスクリプトでの exec コマンドの用途は何ですか? [closed] 質問する

シェル スクリプトにおける exec コマンドの用途を簡単な例を挙げて説明してくれる人はいますか?

ベストアンサー1

組み込みコマンドはexecカーネル内の関数をミラーリングします。 に基づく関数のファミリがありexecve、通常は C から呼び出されます。

exec新しいプロセスを作成せずに、現在のプロセス内の現在のプログラムを置き換えますfork。これは、作成するすべてのスクリプトで使用するものではありませんが、場合によっては便利です。以下は、私が使用したシナリオの一部です。

  1. ユーザーがシェルにアクセスせずに特定のアプリケーション プログラムを実行できるようにしたいとします。/etc/passwd でサインイン プログラムを変更することもできますが、起動ファイルから環境設定を使用するようにしたい場合もあります。したがって、 (say) の.profile最後のステートメントは次のようになります。

     exec appln-program
    

    そのため、戻るためのシェルは存在しません。appln-programクラッシュした場合でも、シェルが存在しない (置き換えられた) ため、エンドユーザーはシェルにアクセスできませんexec

  2. /etc/passwd にあるシェルとは異なるシェルを使用したいと考えています。馬鹿げているように思われるかもしれませんが、一部のサイトでは、ユーザーがサインイン シェルを変更することを許可していません。私が知っているあるサイトでは、全員が で開始し、全員が(csh スタートアップ ファイル) に の呼び出しcshを入れていました。これはうまくいきましたが、不要なプロセスが実行されたままになり、ログアウトが 2 段階になって混乱を招く可能性がありました。そこで、 に変更し、 c-shell プログラムを korn シェルに置き換えて、すべてをシンプルにしました ( はログイン シェルではないなど、他にも問題があります)。.loginkshcshexec kshksh

  3. プロセスを節約するためです。prog1 -> prog2 -> prog3 -> prog4etc. を呼び出して戻らない場合は、各呼び出しを exec にします。これにより、リソースが節約され (繰り返し実行しない限り、それほど多くはありませんが)、シャットダウンが簡単になります。

明らかにどこかで使用されているのを見たことがあるexecはずです。おそらく、問題となっているコードを見せていただければ、その使用を正当化できるでしょう。

編集: 上記の回答が不完全であることに気付きました。シェルでは、と- のように、ファイル記述子を開くために使用される の2 つの用途があります。次に例を示します。execkshbash

exec 3< thisfile          # open "thisfile" for reading on file descriptor 3
exec 4> thatfile          # open "thatfile" for writing on file descriptor 4
exec 8<> tother           # open "tother" for reading and writing on fd 8
exec 6>> other            # open "other" for appending on file descriptor 6
exec 5<&0                 # copy read file descriptor 0 onto file descriptor 5
exec 7>&4                 # copy write file descriptor 4 onto 7
exec 3<&-                 # close the read file descriptor 3
exec 6>&-                 # close the write file descriptor 6

ここではスペースが非常に重要であることに注意してください。fd 番号とリダイレクト シンボルの間にスペースを入れると、exec元の意味に戻ります。

  exec 3 < thisfile       # oops, overwrite the current program with command "3"

これらを使用する方法はいくつかあります。ksh ではread -uまたは を使用しprint -u、 では を使用しますbash。たとえば、次のようになります。

read <&3
echo stuff >&4

おすすめ記事