1. ホーム
  2. シェル

[解決済み】シェルスクリプトでのexecコマンドの使い方は?[クローズド]

2022-03-31 15:38:57

質問

シェルスクリプトのexecコマンドの使い方を簡単な例で説明してくれる人はいませんか?

どのように解決するのですか?

その exec 組み込みコマンドはカーネル内の関数をミラーするものであり、その一群は execve これは通常C言語から呼び出されます。

exec は、現在のプロセスで、現在のプログラムを fork を使用することで、新しいプロセスを作成することができます。 すべてのスクリプトで使うものではありませんが、時折、便利なことがあります。 ここでは、私が使ったことのあるシナリオをいくつか紹介します。

  1. シェルにアクセスすることなく、特定のアプリケーションプログラムを実行させたい。 etc/passwdでサインインプログラムを変更することもできますが、スタートアップファイルから環境設定を利用させたい場合があります。 そこで、(例えば) .profile のように、最後の文に書かれています。

     exec appln-program
    
    

    ということで、今は戻るべきシェルがありません。 たとえ appln-program がクラッシュした場合、エンドユーザーはシェルにアクセスすることができません。 exec が置き換わる。

  2. etc/passwdに登録されているシェルとは別のシェルを使いたいのですが。 バカげていると思われるかもしれませんが、サイトによっては、ユーザーがサインインするシェルを変更することを許可していない場合があります。 私が知っているあるサイトでは、全員が csh を入力し、その後に .login (csh起動ファイル)の呼び出しは ksh . これはうまくいったのですが、その一方で csh プロセスが実行され、ログアウトが2段階になり、混乱する可能性がありました。そこで、私たちはこれを exec ksh これは、c-shell プログラムを korn シェルに置き換えただけで、すべてがシンプルになりました(これには、他にも問題があります。 ksh はログインシェルではありません)。

  3. ただ、プロセスを節約するために もし私たちが prog1 -> prog2 -> prog3 -> prog4 などで、二度と戻らないように、それぞれの呼び出しをexecにしましょう。 これはリソースを節約し(繰り返さない限り、確かに大したことではありませんが)、シャットダウンをより単純にします。

をご覧になったことがあるかと思います。 exec もし、あなたが悩んでいるコードを示してくだされば、その使用を正当化できるかもしれません。

編集 : 上の回答が不完全であることに気づきました。 そこには を使用します。 exec のようなシェルで kshbash - ファイルディスクリプタを開くために使用されます。 以下はその例です。

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