![ターミナルに入力すると、バックグラウンドで実行されている `nc` が妨げられますか?](https://rvso.com/image/668804/%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E3%81%AB%E5%85%A5%E5%8A%9B%E3%81%99%E3%82%8B%E3%81%A8%E3%80%81%E3%83%90%E3%83%83%E3%82%AF%E3%82%B0%E3%83%A9%E3%82%A6%E3%83%B3%E3%83%89%E3%81%A7%E5%AE%9F%E8%A1%8C%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%20%60nc%60%20%E3%81%8C%E5%A6%A8%E3%81%92%E3%82%89%E3%82%8C%E3%81%BE%E3%81%99%E3%81%8B%3F.png)
次の 2 つのコマンドを実行できます。
nc -l localhost 8888 -v >> output.txt &
(while true;do sleep 1;echo a;done)|nc localhost 8888 &
すべては「a」で埋めることで期待どおりに動作しますoutput.txt
(別の端末から末尾が付けられます)。ただし、バックグラウンド ジョブを実行している端末に 1 文字入力すると、送信がからnc
に変わります。Running
Stopped
$ jobs
[1]+ Stopped nc -l localhost 8888 -v >> output.txt
[2]- Running ( while true; do
sleep 1; echo a;
done ) | nc localhost 8888 &
また、「バックグラウンド」のアンパサンドが失われることにも注意してください。これをデバッグするにはどこから始めればよいかわかりません。これは想定された動作ですか? ありがとうございます。
Mac OSX 10.9、GNU Bash 3.2.52
答え1
netcatは双方向です。からソケットをstdoutに出力し、にstdin からソケットを取得します。キーを押すと、stdin (tty) でデータが利用可能であることが認識され、読み取ろうとします。バックグラウンド ジョブは tty からの読み取りが許可されていないため、一時停止されます。
ソケットでデータを送信する予定がない場合は、</dev/null
netcat コマンドに追加する必要があります。
jobs
また、ジョブの状態が変化すると、コマンドによってアンパサンドが追加または削除されるのは正常です。