「head /bin/ls」が端末をリセットするのはなぜですか?

「head /bin/ls」が端末をリセットするのはなぜですか?

同じ愚かなことをすると、cat /var/log/wtmpスクリーンショットのように端末が複雑になる可能性があります。私は多くの方法があることを知っています。この問題を解決する。数年前に聞いた記事で言及されていない方法の1つは、スクリーンショットの赤いボックスに強調表示されたコマンドを実行することです。

head /bin/ls

これはうまくいきます。

なぜ?

端末リセットスクリーンショット

答え1

端末は、表示する文字データと共に送信されるエスケープシーケンスによって制御されます。たとえば、これはecho -e '\e[34m'多くの端末のテキストを青色に置き換える方法です。一部の文字を端末に再エコーします。これは前景色を設定するエスケープシーケンスです。

一部の代替文字セット(およびおそらくそれ以上)に切り替えるように指示され、端末がめちゃくちゃになりました。/var/log/wtmp文字セットを切り替えるためのエスケープシーケンスが含まれているので、これを行います。技術的にはあまり汚れません。設計どおりに正しく動作します。 (tput smacs必要に応じて端末を操作してください。tput rmacsこのパラメータをもう一度変更してください。)

resetエスケープシーケンスを送信してさまざまなパラメータをデフォルト値にリセットするのと同じ機能です。これにより、端末が「修正」されます。

このhead /bin/lsトリックは、あなた/bin/ls(または少なくともの印刷された部分head)にターミナルパラメータを再変更するエスケープシーケンスが含まれているために機能します。これはまったく移植性がありません。たとえば、ここでは動作しません。そして、デフォルト値をリセットするのは、おそらくreset待つよりもはるかに大胆な作業です。 )

答え2

実際、写真にはアウトラインは表示されません。ランニングreset(通常)が役立ちます。それ。さらに、reset固定端末モードは以下より安定していますstty sane

  • これにより、stty saneエコーとキャリッジの戻りに関するターミナルモードの問題が解決されます。Unixまたはなど、ユーザーが不要な値に削除文字を設定するプラットフォーム(つまり、AIX、HPUX、およびSolaris)^?#^H
  • このresetコマンド(少なくともncursesによって提供されるコマンド)はこれらの設定を改善し、端末初期化文字列を送信します。それ通常代替文字セットをリセットします(ただし、一部の端末は異なる場合があります。これはUnix端末の説明で見落とされている機能です)。

もしあなたなら持つ線画の文字を表示します。これらの文字は引っ越す制御文字(エスケープシーケンスではありません):

SO        Shift Out (Ctrl-N) -> Switch to Alternate Character Set.  This
          invokes the G1 character set.

私が作った線画キャラクターのスクリーンショットは次のとおりです。

ls
tput smacs
ls -l

ここに画像の説明を入力してください。

時々、誰かがバイナリゴミと線で描かれた文字が混在している画像が表示されますが、この質問や他の言及された(ab)質問ではその機能を使用しません。逆に彼ら言う2つの異なる機能があります。

  • すべての文字を印刷できるわけではありません(図の大きなスペースを考慮)。
  • 一部のバイトシーケンスは正当なUTF-8を形成せず、端末エミュレータによって特別なマーカーで表示されます。Unicode 代替文字

追加資料:

関連情報