web-dev-qa-db-ja.com

コマンドの実行前後にbashはどのようにtty属性を設定しますか?

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属性が復元されますか、またはプログラムによって変更された場合、一部の属性が復元されない可能性がありますか?

1
Igor Liferenko

これは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)のマンページに記載されています。

2
mosvy