run コマンドを使用すると、exec
コマンドの実行が完了した後に親シェルが終了します。実行されたコマンドがexec
正常に実行されたことを確認するには?
答え1
'dプログラムをexec
正常に使用した場合exec
変えるあなたの殻。 'dexec
プログラムの終了状態は、シェルを実行する親プロセスに戻されます。
execの終了ステータスを次の行で説明できる唯一の方法は、exec
exec呼び出しが失敗した場合です。通常、要求されたコマンドがない場合、またはファイルを実行できない場合にのみ発生します。オプションの解決問題はexecプログラムの起動後に解決されるため、これには含まれません。
シェルがプログラムの終了コードを解釈できるようにするには、to をexec
使用してこれを行うことはできません。シェルでプログラムを実行すると、完了すると終了ステータスが表示されます。
詳細については、以下を参照してくださいman 3 exec
。この関数またはその姉妹関数の1つは、シェルが呼び出す基本的な低レベルのUnix関数です。
シェルコマンドラインで使用するのが合理的であると考えられる唯一の理由は、exec
シェルで使用するメモリが問題となるメモリが非常に低いシステムや分岐問題があり、幸運にも使用できるシステムにあることです。シェルは新しいプロセスを分岐できず、問題を解決するには新しいプロセスが1つだけ必要です。
たとえば、execの一般的な使用はシェルスクリプトで行われます。
(@ chicksに感謝します。)アプリケーションが終了すると、ログインスクリプトで信頼性の低いユーザーにコンソールを委任すると、ユーザーはシェルを制御できません。
exec'dプログラムの前提条件(環境、ulimit)のみを設定するシェルスクリプトでは、exec'dプログラムの戻りコードがスクリプトを呼び出す人に直接返されることを望みます。実行中のプロセスのPIDは同じであるため、スクリプトはプロセスを記録できます。
答え2
~によるとマニュアルページの実行:
もし注文する指定された
exec
シェルは返すべきではありません...
したがって、後でいくつかのコードを取得できますexec
。このコードに達すると、何かが間違っています。
exec foo
ret=$?
## foo was not executed.
そうしないと、シェルから呼び出された呼び出しスクリプトがコマンドexec
からステータスを取得できますfoo
。
たとえば、上記のようにbash1
call bash2
、bash2
callと入力します。exec foo
この場合、bash1
戻りコードはから取得されますfoo
。
bash2
呼び出しでエラーが発生しますexec foo
。
答え3
実行されたコマンドの終了ステータスを使用して、コマンドが機能していることをexec
確認できます。ただし、コマンドが自己終了状態で意味のあるタスクを実行し、知りたい内容が終了状態にエンコードできるほど簡単です。
bash
exec
実行されたコマンドのstdoutとstderrが保存されているようです。実行されたコマンドの出力を使用して動作していることをexec
確認できると思います。
また、実行中のコマンドの権限を確認するように見えるbash
ため、実行または読み取り権限なしでファイルを提供すると、いくつかの出力が得られます。