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