1

シェルから入力を受け取り、結果を出力するプログラムを作成しました。ただし、パイプラインを使用すると、入力がエコーされません。

$ ./a.out
$ /home/Wisatbff/file       # input a pathname (echoed)

パイプラインを使用:

$ ./a.out | more
$                           # input (same as above, not echoed)

どちらも正しく出力されます。パイプラインを使用しているときに入力がエコーされないのはなぜですか?

4

1 に答える 1

1

編集(以前の回答は間違っていました。質問を誤解していました):

コマンドmoreは端末構成を変更しています。

起動している tty を見つけて、./a.out | more別の tty (または他のターミナル) からこのコマンドを実行します。

stty -F /dev/yourTTY echo

そして、コンソールに再びエコーが表示されます

疑似端末を使用している可能性がありますが、sttyコマンドも同様に機能するはずです。

:

  1. 現在の端末を確認します。ps ax | grep $$ | awk '{ print $2 }'
  2. コマンドを実行します。./a.out | more
  3. 新しいターミナルを開き、次のコマンドを実行します。stty -F /dev/resultFromFirstStep echo
  4. 最初の端末で再びエコーがあることを確認してください。

編集:

ところで、誰かが興味を持っている場合は、コード ソースmoreを読み取る端末がどのように変更されているかを確認できます。

void set_tty () {
    otty.c_lflag &= ~(ICANON|ECHO);
    otty.c_cc[VMIN] = 1;    /* read at least 1 char */
    otty.c_cc[VTIME] = 0;   /* no timeout */
    stty(fileno(stderr), &otty);
}

ECHOとICANONを奪っています。

于 2013-10-25T16:43:11.783 に答える