xterm
を開き、tty
を実行して、疑似端末スレーブファイルを確認します(たとえば、/dev/pts/0
)。次に、別のxterm
を開いて実行します
$ stty -F /dev/pts/0
speed 38400 baud; line = 0;
lnext = <undef>; discard = <undef>; min = 1; time = 0;
-brkint -icrnl -imaxbel iutf8
-icanon -echo
次に、最初のxtermで/bin/sleep 1000
を実行します。次に、同じstty
コマンドを2番目のxtermで再度実行します。
$ stty -F /dev/pts/0
speed 38400 baud; line = 0;
-brkint -imaxbel iutf8
次に、最初のxtermでsleep
コマンドを終了します。次に、同じstty
コマンドを2番目のxtermで再度実行します。
$ stty -F /dev/pts/0
speed 38400 baud; line = 0;
lnext = <undef>; discard = <undef>; min = 1; time = 0;
-brkint -icrnl -imaxbel iutf8
-icanon -echo
Bashは、コマンドを実行する前にtty属性を変更し、コマンドの実行後にそれらを復元していることがわかります。 bashのドキュメントのどこに記載されていますか?すべてのtty属性が復元されますか、またはプログラムによって変更された場合、一部の属性が復元されない可能性がありますか?
これはreadline(3)
行編集ライブラリであり、通常はbashの一部として静的に構築されますが、他のプログラムでも使用されます。
Readlineは、ユーザーからのコマンドの読み取りを開始するたびに、端末の設定を保存し、端末を「raw」モードにします[1]。これにより、挿入ポイントの左右の移動を処理し、履歴からコマンドを呼び出すことができます。など。readline(3)
が戻ると(たとえば、ユーザーがEnterキーを押したとき)、端末の元の設定が復元されます。 Readlineもシグナルを混乱させ、その結果、いくつかの 不可解な動作 になる可能性があります。
bash
をstraceする場合は、ioctl(TCSETS*)
(tcsetattr(3)
を実装)とioctl(TCGETS)
(tcgetattr(3)
)を探します。これらは、stty(1)
で使用されるのと同じ関数です。 _--noediting
_でbashを実行すると、ターミナル設定がそのままになることがわかります。
[1] cfmakeraw(3)
の「生の」モードとは異なります。あなたは正確な詳細を見ることができます ここ 。これらの端末設定はすべて、termios(3)
のマンページに記載されています。