私はあまり詳しくありません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の問題である可能性があると考えています。
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が組み込まれています。これはbash内でのみ利用可能であるためxargs
、実行するために見つけることができません。
exec
メインシェルで最後に、あなたは試しました
exec ls
これが実行さls
れ、ターミナルがハングしました。これは、文書化されているように、シェルプロセスに取って代わったためです。一度ls
終了していると、端末で実行して、もはや何もありません。(一部のターミナルエミュレーターは、この時点で自動的に閉じます。幸い、閉じられなかったため、出力を表示できました。)
あなたがフォローしようとしていた例では、余分なステップを持っていました:
bash
exec ls
これは最初bash
に、「トップレベル」の子として実行される新しいを開始します。次にexec ls
、そのシェルを置き換えて終了します。その後、親シェルが再開するため、端末がスタックしたままになることはありません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加