std入力とstd出力リダイレクトを使用してバックグラウンドでプロセスを実行する

std入力とstd出力リダイレクトを使用してバックグラウンドでプロセスを実行する

バックグラウンドでプロセスを実行し、入出力をリダイレクトする方法はありますか? Javaスキャナを使用してSystem.inを入力として追加するJavaプログラムがあります。だから私はファイルから読み取るためにstd入力をリダイレクトしたいと思います。まず、これが可能かどうかはわかりません。以下は機能しません:

$: java Bagels << in.txt &

ただ中断されます。

また、同時に実行される他のプログラムで使用できるように、プログラムの出力を別のファイルに書きたいと思います。理想的には次のようになります。

$: java Bagels << in.txt & >> out.txt &
$: python player.py << out.txt & >> in.txt &

答え1

最初の例は、次のように開始する必要があります。

java Bagels < in.txt

作成したとおり、これは次Bagelsのように実行されます。標準入力ファイルin.txt1から。後ろにアンパサンドを追加すると、&プログラムがバックグラウンドで実行され、より多くのコマンドを入力できるように、端末のコマンドプロンプトが準備されます。

in.txt私は2番目の例がこのようになると思いますが、out.txt通常、あるプログラムの出力を別のプログラムの入力に供給し、2番目のプログラムの出力を最初のプログラムの入力に供給するのは少し混乱しています。良いアイデア。

java Bagels < in.txt | player.py > out.txt

その機能はin.txt次に追加することです。標準入力Javaプログラム(<ファイル内)、そのプログラムを追加します。標準出力出力先標準入力入力player.pyして書きます標準出力Pythonプログラムをファイルに出力しますout.txt>TOファイルが書き込み専用モードで切り捨てられ、>>追加に置き換えられたり、1<>切り捨てられずに読み書きモードで開きます)。

最後に、最初の文に書いた質問に答えてください。」バックグラウンドでプロセスを実行し、入出力をリダイレクトする方法はありますか?「、こう集めておけばいい。

java Bagels < in.txt > out.txt &

¹ここで読み取り専用モードで開くには、<>または0<>ksh93に置き換えて読み取り+書き込みモードで開きます。しかし、実際にstdinを読み書きモードで開く必要がある場合は非常にまれです。

答え2

簡単にするために "cat"コマンドを使用する例を挙げます。 (「cat」は入力を読み書きするだけです。)「cat < input」と入力すると、catコマンドは「input」ファイルから取得されます。ただし、「cat << end_of_input」と入力すると(ここで説明されている)、「end_of_input」行を書き込むまで、シェルが(キーボードから)入力したすべての入力行を読み込みます(ctrl_dはほとんどの場合機能します)。場合も同様です)その後、catコマンドはユーザーが入力した入力として実行されます(もちろん、end_of_input行を除く)。これは、ユーザーが入力を入力するのを待っているため、停止する理由です。

ここに画像の説明を入力してください。

標準入力をリダイレクトする場合コマンド出力をファイルにリダイレクトするには、「command < input_file」を作成します。 2つのオプションがあります。

1- "cmd>出力"(">"は1つしかありません)、この場合、名前が "output"のファイルがすでに存在する場合は、コマンド出力で上書きされます。

2-「cmd>>output」(2つの「>>」を参照):「output」ファイルが存在する場合は、コマンドの出力をそのファイルに追加します。コマンドが前のコマンドの出力から入力を受け取る方法については、「パイプ」を使用できます。

簡単な例を見てみましょう: "ls | cat"、これは "ls"コマンドの出力を "cat"コマンドの入力にリダイレクトします。 (プロセスがバックグラウンドで実行できる場合、プロセスがバックグラウンドで実行されているという事実は不適切です。)

これが役に立つことを願って幸運を祈ります。

関連情報