Rubyコマンドはttyエコーをオフにします

Rubyコマンドはttyエコーをオフにします

Rubyスクリプトを実行した後、ほぼ100%の場合、bashコマンドラインは現れる非アクティブであるように見えますが、実際にはキー入力を黙って受け入れているだけで、表示はされません。

この問題は、複数の OS アップデートを通じて、複数のバージョンの Ruby で発生しています。現在、OS X 10.9.2 で v1.9.2p29 を実行しています。ではreset問題が修正されますが、、clearその他では修正されません。

以下の「今は不要」などは、表示されないechoコマンドの出力です。

$ echo Now you see my typing...
Now you see my typing...

$ bundle exec jekyll build
...
done.

$ This is the output of an unseen echo command

$ About to run "reset"

$ echo And we''re back.
And we're back.

stty -a正常に動作している場合の出力:

speed 9600 baud; 57 rows; 187 columns;
lflags: icanon isig -iexten echo echoe echok echoke -echonl echoctl
    -echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
    -extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff -ixany imaxbel iutf8
    -ignbrk brkint -inpck ignpar -parmrk
oflags: opost onlcr oxtabs onocr onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
    -dtrflow -mdmbuf
cchars: discard = ^O; dsusp = <undef>; eof = ^D; eol = <undef>;
    eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;
    min = 1; quit = ^\; reprint = ^R; start = ^Q; status = <undef>;
    stop = ^S; susp = ^Z; time = 0; werase = ^W;

stty -a状況がそうでない場合の出力:

speed 9600 baud; 57 rows; 187 columns;
lflags: -icanon isig -iexten -echo echoe -echok echoke -echonl echoctl
    -echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
    -extproc
iflags: -istrip icrnl inlcr -igncr ixon -ixoff -ixany imaxbel iutf8
    -ignbrk brkint -inpck ignpar -parmrk
oflags: opost onlcr oxtabs onocr onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
    -dtrflow -mdmbuf
cchars: discard = ^O; dsusp = <undef>; eof = <undef>; eol = <undef>;
    eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U;
    lnext = <undef>; min = 1; quit = ^\; reprint = <undef>;
    start = ^Q; status = <undef>; stop = ^S; susp = ^Z; time = 0;
    werase = <undef>;

特に、 では が になっていることに気が付きlflagsましecho-echo

何が原因なのか、他にどのような設定や診断をチェックする必要があるのか​​分かりません。

答え1

プロンプトにこれを入力すると:

$ And now you don't.
> 

これはコマンド ラインの継続をトリガーします。どうやら OSX でセカンダリ プロンプトを設定していないようです (プロンプトのことだと思います)。ただし、問題は特定の文字列 "$ And now you don't.`" を使用しているために発生します。

これを入力すると:

$ echo And we''re back.
And were back.

継続を閉じています。別の文字列を試して、同じ問題が発生するかどうかを確認してください。

注記:肝心な問題は、 の使用方法です'....'

答え2

ターミナルドライバ設定の設定echoは、ターミナルドライバがエコー入力した文字を戻します。viまたは最新のシェルのようなアプリケーション彼らの指示に従ってそれを使わないし、ターミナルも使わない標準モード、すべてのキー操作を処理し、エコー端末デバイスに書き込むことによって、自分で入力したもの。

bashただし、readlineやそれを使用するアプリケーションはgdb彼らの 反響する端末がecho無効になっていることを検出すると、他のシェルはそれを好みzshますtcsh

readline は独自のエコーを行うため、 (または独自の行エディタを持つ最近のシェル)シェル プロンプトではがecho常に無効になっていることに注意してください。 / は各プロンプトの前に端末設定を保存し、それを行エディタを実装するために必要な設定( の無効化を含む)に設定し、コマンドを実行する前に保存した値にリセットします。bashbashreadlineecho

の出力はstty -a保存された設定です。また、 /readline(他のシェルはそうではありません)は、無効になっているbash場合は独自のエコーを無効にします。echo保存された構成で

次のコマンドを発行すると、表示されているのと同じ動作が得られます。

stty -echo

viアプリケーションは通常、パスワード プロンプトを発行するとき、または上記の場合のようにbash、独自のテキスト編集を実装するためにターミナル エコーを無効にし (その後、ターミナル標準モードを使用しません)、終了時に設定を復元します。

あなたのケースのもう 1 つの違いは、icanon無効になっていることです。これは、2 番目のケースである可能性が高いことを示唆しています。

おそらく、Ruby スクリプトは、ターミナル設定を正しくリセットできないビジュアル アプリケーションを起動します。そのアプリケーションが SIGKILL などのトラップ不可能なシグナルで強制終了された場合、またはアプリケーションがまだ実行中または一時停止中の場合、この問題が発生する可能性があります。

stty saneターミナル設定を復元するには、または を実行しますreset。まだ実行中のプロセスがないこと、スクリプトがどのアプリケーションを実行しているか、なぜ誤動作しているのかなどを確認することをお勧めします。

関連情報