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

おすすめ記事