前のコマンドがSTDOUTに書き込まれている間、STDINに別のコマンドを入力しても安全ですか?

前のコマンドがSTDOUTに書き込まれている間、STDINに別のコマンドを入力しても安全ですか?

おそらく、この質問は以前に答えられたことがあります。他の答えへのリンクを歓迎します...

bash次のように(シェルから)シェルコマンドを実行すると:

make

その後、コマンドの出力がコマンドmakeの前でスクロールされ、最初のコマンドの実行が完了する前に入力され、押すと、コマンドが最終的に完了するとすぐに次のコマンドが開始され、実行されます。STDOUTmakemake checkentermakemake check

私の質問は簡単です。

  1. これは危険ですか?
  2. このように急いで入力すると、予期しない動作が発生しますか?
  3. なぜこれが起こるのですか?

答え1

このように動作する理由は、Unixが全二重であるからです。金持ちが言うようにUNIX時分割システム:レビュー:

慣れれば驚くべき違いを生み出す些細なことの一つは全二​​重ターミナルI/Oと先読みです。プログラムは通常、個々の文字ではなく行を介してユーザーと通信しますが、全二重端末I / Oは、システムが再入力しても文字が失われたり壊れたりすることなくユーザーがいつでも入力できることを意味します。先読みを使用すると、各行に対する応答を待つ必要はありません。良いタイピストは、文書を入力するときに各行を開始する前にしばらく停止する必要があるため、非常にイライラします。自分が言いたいことを知っている人なら、情報を一行ずつ入力しなければならないと痛いでしょう。最高速度。遅い反応は心理的に増幅される。

【引用終了】

ただし、一部の最新プログラムは、事前入力されたコンテンツをすべて使い果たしたり削除したりします。sshそしてapt-get以下は2つの例です。実行中に早く入力すると、入力の最初の部分が消えたことを確認できます。想像できるように、これは問題になる可能性があります。

ssh remotehost do something that takes 20 seconds
mail bob
Dan has retired. Feel free to save any important files and then do
# ssh exits here, discarding the previous 2 lines
rm -fr *
.

答え2

あなたが見ることができるデフォルトの動作は、入力が読み込まれるまでバッファのどこかにあることです。 (まあ、十分に入力すると、最終的にバッファがいっぱいになり、一部の内容が失われます。たくさん入力中)。 make によって実行されるほとんどのエントリは STDIN から読み込まれないため、バッファに残ります。

危険は、誤ったコマンドが入力を読み取ることです。たとえば、make呼び出しは、ユーザーに何を求めるかを決定した後、応答として次のコマンドを読み取ることができます。もちろん、これがどれほど危険なのかは順序によって異なります。 (また、すべての入力を最初にフラッシュし、古い入力を削除することもできます。)

Makefileでよく使用されるTeXコマンドを使用すると、この目的を達成できます。エラーが発生した場合(およびユーザーにメッセージを表示しないフラグが与えられた場合)、進行方法を尋ねるメッセージが表示されます。

より良いオプションは、以下を実行することですmake && make check

答え3

  1. まあ、明らかに、make正常に完了した最初のコマンド(例では)に依存する2番目のコマンドを実行しないでください。たとえば、make foo Enter> ./foo Enter 問題が発生する可能性があります。次のように入力する習慣を聞くことをお勧めしますmake && make check。ここで、2番目のコマンドは、最初のコマンドが成功した場合にのみ実行されます。
  2. 理論的には、最初のコマンド(プロセス)は2番目のコマンドの一部を読み取るか、それ以外の場合は端末入力バッファからそれを削除できます。最初の6文字を食べると、make check最終的にそのコマンドを実行します。このコマンドheckはおそらくシステムには存在しません(ただし、何か不快なものかもしれません)。最初のコマンドがあなたが知っていて信頼できる適切なコマンドであれば、私はすぐにそのコマンドに問題があるとは思わないでしょう。
  3. どのように/なぜ動作しますか?システムはキーボード入力をバッファリングします。これは電子メールに似ています。短い時間内に誰かに5つのメッセージを送ると、その人は受信トレイに座り、その人が読むのを待ちます。同様に、最初のコマンドをキーボードから読み取らない限り、入力したコマンドはシェルが読むのを待ちます。 「typeahead」がバッファリングできる量には制限がありますが、通常は数百文字(千文字ではない場合)です。

関連情報