web-dev-qa-db-ja.com

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

おそらくこれは以前に回答されているので、別の回答へのリンクを歓迎します...

次のようなシェルコマンドを(bash Shellで)実行すると、

make

次に、makeからの出力がSTDOUTコマンドのmakeからスクロールしているときに、make checkを押して enter 最初のコマンドの実行が完了する前、makeコマンドが最後に次のコマンドを完了するときmake checkすぐにピックアップして実行します。

私の質問は単純です:

  1. これは危険ですか?
  2. この種のラッシュタイピングによる予期しない動作の可能性はありますか?
  3. なぜこれがそのように機能するのですか?
21
111---

Unixは全二重であるため、これは同じように機能します。リッチーが言ったように NIXタイムシェアリングシステム:回顧展

些細なことのように思われるが、慣れると意外な違いを生むものの1つは、先読み付きの全二重端末I/Oです。プログラムは通常、1文字ではなく行でユーザーと通信しますが、全二重端末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 *
.
20
Mark Plotnick

あなたが見ている基本的な振る舞いは、入力が読み込まれるまでバッファのどこかに置かれていることです(まあ、十分に入力すると、最終的にはバッファがいっぱいになり、何かが失われますlot入力の)。 makeによって実行されるほとんどのものは、STDINから読み取られないため、バッファーに残ります。

危険は、間違ったコマンドが入力を読み取ることです。たとえば、makeは、プロンプトを表示することを決定する何かを呼び出します。その後、次のコマンドを応答として読み取る場合があります。もちろん、それがどれほど危険かはコマンドによって異なります。 (また、以前の入力を破棄するだけで、最初にすべての入力をフラッシュする場合もあります。)

Makefileで一般的に使用される1つのコマンドは、TeXです。エラーが発生した場合(およびユーザーにプロンプ​​トを表示しないようにフラグが設定されていない場合)、続行する方法をプロンプトで表示します。

より良いオプションはおそらく実行することです:make && make check

12
derobert
  1. まあ、半ば明らかに、最初のコマンド(この例ではmake)が正常に完了したことに依存する2番目のコマンドを実行するべきではありません。たとえば、make foo Enter>./foo Enter 問題が発生する可能性があります。最初のコマンドが成功した場合にのみ2番目のコマンドが実行されるmake && make checkのようなものを入力する習慣を身に付けたいと思うかもしれません。
  2. 理論的には、最初のコマンド(プロセス)が2番目のコマンドの一部を読み取るか、それ以外の方法で端末の入力バッファーから削除する可能性があります。 make checkの最初の6文字が食べられた場合は、コマンドheckを実行することになります。最初のコマンドがあなたが知っていて信頼できる良性のものである場合、私はすぐには問題を見つけません。
  3. どのように/なぜ機能するのですか?システムはキーボード入力をバッファリングします。これはメールに少し似ています。短い時間で5つのメッセージを送信でき、受信トレイに座って、メッセージが読まれるのを待ちます。同様に、最初のコマンドがキーボードから読み取っていない限り、入力したコマンドはそのまま残り、シェルがコマンドを読み取れるまで待機します。バッファできる「先行入力」の量には制限がありますが、通常は数百文字です(数千ではない場合)。
8
Scott