パイプにexec

パイプにexec

私は にあまり詳しくありませんexec。いくつかのテストと例を実行していました。ファイルに記述されたコマンドを に渡したいと考えていました。そのコマンドは、execコマンドラインで直接実行した場合と同じように で実行されることを期待しています。以下は私が設定して試した内容です。

[kellyry@ch12ldvela00 ~]$ cat exec_test
ls
[kellyry@ch12ldvela00 ~]$ cat exec_test | exec
[kellyry@ch12ldvela00 ~]$ cat exec_test | xargs exec
xargs: exec: No such file or directory
[kellyry@ch12ldvela00 ~]$ exec ls
exec_test            file2             file3
. . .          

最も奇妙な部分は次のとおりです。最後の行を実行してexec lsも戻りません。つまり、ターミナルがハングし、通信できません。この最後の問題は、サーバーに SSH 接続するために使用している Mobaxterm の問題である可能性があると考えています。

答え1

マンページからbash:

exec [-cl] [-a name] [command [arguments]]

が指定されている場合はcommand、シェルが置き換えられます。新しいプロセスは作成されません。

[...]

が指定されていない場合command、リダイレクトは現在のシェルで有効になり、戻りステータスは 0 になります。

パイプにexec

最初に試したのは

cat exec_test | exec

これは引数としてではなく、標準入力に送信します。 ls引数なしで実行され、リダイレクトもないため、何も実行されません。execexec

ファイル内のコマンドを実行(または「実行」)したい場合、 は使用できません。 (または省略形)execを使用して実行できます。source.

source exec_test

パイプにxargs exec

次に試みたこと

cat exec_test | xargs exec

exec強打だ内蔵これは bash 内でのみ使用可能であるため、xargs実行するために見つけることができません。

execメインシェル内

ついにあなたは試した

exec ls

これは を実行しls、その後ターミナルをハングさせました。これは、ドキュメントに記載されているように、シェル プロセスを置き換えたためです。 がls終了すると、ターミナルでは何も実行されなくなります。(一部のターミナル エミュレーターは、この時点で自動的に閉じます。幸い、お使いのエミュレーターは閉じられなかったので、出力はまだ表示されています。)

あなたが従おうとしていた例追加の手順がありました:

bash
exec ls

これはまず、新しい を起動しbash、「トップレベル」のシェルの子として実行します。次に はexec lsそのシェルを置き換えて終了します。その後、親シェルが再開されるため、ターミナルがスタックしたままになることはありません。

関連情報