tail -f
したい ファイルですが、その内容はsjis
にあります エンコーディングなので、端末のネイティブ(utf-8)エンコーディングに変換する必要があります。
私がするとき
テール-fx| iconv -fsjis
出力はありません。として
テールx| iconv -fsjis
動作します。最初はバッファリングの問題だと思いましたが、unbuffer
を試してみました。 およびstdbuf
パイプのバッファリングをオフにするで説明したように、役に立ちませんでした。
実際、10kを超えるデータがxに追加された後でも出力がないので、バッファリングの問題ではないと思います(私が間違っていなければ、バッファは4kです)が、iconvは次の場合にのみ出力を開始しますEOFを受け取ります。
では、どうすればsjisでエンコードされたファイルをテールフォローできますか?
承認された回答:
(これをほんの少しの塩で取ってください)私が覚えている限り、問題はlibiconv
の方法にあります 動作します。マルチバイトエンコーディングには、それらをデコードするためのステートマシンと、libiconv
が必要です。 文字全体を受け取ることを好むため、ある関数呼び出しで半分の文字を与え、次の関数呼び出しで残りの半分を与えることはできません。
別の2つの解決策を考えることができます。1つは優れた帯域外方式であり、もう1つは帯域内ハックです。
ターミナルエミュレータエンコーディングの変更(帯域外) :1つは、ターミナルエミュレータで文字エンコードを変更することです。したがって、そのネイティブエンコーディングはShiftJISです。 konsole
をチェックしました 、およびはこれをサポートします。メニューから、[表示]→[文字エンコード]→[日本語]→[sjis]を選択します。次に、tail -f
を実行できます。 ファイル、およびkonsole
マルチバイト文字のデコードとフォントグリフへの一致を処理します。
オンザフライでのトランスコード端末エンコーディング(帯域内、最適) :luit
を思い出させてくれたGillesの好意による 非常に長い時間の後。 luit
を使用する 、XOrgディストリビューションに付属しているはずです(Debianでは、パッケージx11-utils
)。次のように使用します:
$ luit -encoding SJIS -- tail -f x
これにより、ターミナルトランスコードSJISがターミナルエンコーディングとの間で送受信され、tail -f x
が実行されます。 。 luit
の欠点 libiconv
でサポートされている豊富なエンコーディングをサポートしていないということです 。利点は、ほとんどどこでも利用できることです。
オンザフライでのトランスコード端末エンコーディング(インバンド、ハック) :ttyconv
libiconv
を使用する、私が何年も前に書いたハックです(最初はCで、後でPythonでやり直しました)。 端末I/Oをトランスコードします。新しい疑似端末を生成し、(a)入力した文字をローカルエンコーディングからリモートエンコーディングにトランスコードし、(b)リモートエンコーディングから受け取った文字をローカルエンコーディングにトランスコードします。標準のLinux端末でサポートされていないエンコーディングを使用するサーバーと通信するために使用しました。テストしたリモートエンコーディングはすべてシングルバイトエンコーディングであったため、ShiftJISで機能することを保証できません。最近では、ほとんどのシステムがUnicodeに切り替えられているため、これを使用するための呼び出しはあまりありません。
これがあなたの使い方です:
$ ttyconv -rsjis -- tail -f x
ttyconv
の欠点 私が書いたということです。私以外は誰も使っていません。おそらくバグでいっぱいです。私はこれが得意です。利点は、libiconv
を使用することです 、したがって、エンコーディングが異常な場合は、それが最善の策です。最後に、ttyconv --list
100個のエンコーディングをサポートします。