コマンド出力を実行/バックグラウンドコマンド入力に接続します。

コマンド出力を実行/バックグラウンドコマンド入力に接続します。

Bash 4.Xでは、次のことができます。

command that expects input &
echo some output | %1

%1は最初のバックグラウンドコマンドを表しますか?

答え1

はい、しかしもう少し必要です。

プログラムをバックグラウンドで送信すると、stdin端末との接続が切断されます。代替入力(この場合はパイプ)で始める必要があります。

$ mkfifo alternate_input
$ command_that_expects_input < alternate_input

alternate_inputこれで、パイプファイル()をstdinプロセスのファイルとして指定しましたcommand_that_expects_input。入力を送信するには、パイプに何かを入れるだけです。

$ echo foo > alternate_input

この場合、文字列はforfooに送信されます。stdincommand_that_expects_input

答え2

始めたら:

rm -i -- * &

rmコマンドが呼び出されたときにシェルにあったstdinで始まりました。

端末の場合、端末rmから読み取ろうとすると(端末のフォアグラウンドプロセスグループに属さないため)、通常停止します(SIGTTIN信号を使用)。

他のものから読むには、他のものからファイルディスクリプタ0を再度開くように指示する必要があります。

デバッガを使用してこれを行うことができます(Linuxを使用しているとします)。

rm_pid=$!
coproc yes
gdb --pid="$rm_pid" --batch \
    -ex "call close(0)" \
    -ex "call open(\"/proc/$$/fd/$COPROC\", 0)" /bin/rm
kill -s CONT "$rm_pid"

上記では、yes背景から始めて、標準入力と標準出力をパイプにリダイレクトします。このパイプのもう一方の端は、$$ファイル記述子(別名)の${COPROC[0]}シェル(プロセス)にあります$COPROC

次に、を使用してfd 0を閉じ、同じパイプで再度開くようにgdb指示します。rm

答え3

あなたの家によると、そうではありません。 terdonが言ったように、最初に入力をパイプする必要があることを知っていれば、はるかに簡単です。プログラムに今は入力は必要ありませんが、今後は入力が必要になる珍しい(そして私は見たことがありません)場合、名前付きパイプをプロセスへの入力として設定し、それをバックグラウンドに置いてから送信できます。同じ名前付きパイプで後でプロセスが開始されますが、名前付きパイプを事前設定する必要があります。

関連情報