私は にあまり詳しくありません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
引数なしで実行され、リダイレクトもないため、何も実行されません。exec
exec
ファイル内のコマンドを実行(または「実行」)したい場合、 は使用できません。 (または省略形)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
そのシェルを置き換えて終了します。その後、親シェルが再開されるため、ターミナルがスタックしたままになることはありません。