私はそれについてあまり慣れていません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
これは最初に "top"の子として実行される新しいものを始めます。その後、exec ls
そのシェルを交換して終了します。これにより、親シェルが再起動し、端末がハングすることはありません。