疑似ターミナルスレーブファイルを開き、xterm
実行してみますtty
(1つと仮定/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
/bin/sleep 1000
次に、まずxtermで実行します。次に、stty
2 番目の xterm で同じコマンドを再実行します。
$ stty -F /dev/pts/0
speed 38400 baud; line = 0;
-brkint -imaxbel iutf8
sleep
その後、最初のxtermでコマンドを終了します。次に、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
readline(3)
これは通常bashの一部として静的に構築されますが、他のプログラムでも使用される行編集ライブラリです。
ユーザーのコマンドを読み始めるたびに、readlineはターミナル設定を保存し、ターミナルを「raw」モード[1]に設定して挿入ポイントを左右に動かし、戻ったときに履歴からreadline(3)
コマンドを呼び出します。 Enterキーを押すと、端末の元の設定が復元されます。 Readlineは信号を台無しにすることもできます。謎のような行動。
をstraceする場合は(whichimplements)と()bash
を見つけます。 bashを実行すると、端末設定が維持されていることがわかります。ioctl(TCSETS*)
tcsetattr(3)
ioctl(TCGETS)
tcgetattr(3)
stty(1)
--noediting
[1]正確に「生」モードではありませんが、具体的cfmakeraw(3)
な詳細を見ることができます。ここ。これらの端末設定はすべてtermios(3)
マンページに文書化されています。