GNU/Linux >> Linux の 問題 >  >> Linux

「tail-f| Iconv -fsjis」は何も出力しませんか?

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に切り替えられているため、これを使用するための呼び出しはあまりありません。

関連:電気– TTLデジタル出力を備えたセンサー?

これがあなたの使い方です:

$ ttyconv -rsjis -- tail -f x

ttyconvの欠点 私が書いたということです。私以外は誰も使っていません。おそらくバグでいっぱいです。私はこれが得意です。利点は、libiconvを使用することです 、したがって、エンコーディングが異常な場合は、それが最善の策です。最後に、ttyconv --list 100個のエンコーディングをサポートします。


Linux
  1. gnome-terminal:コマンドが見つかりません

  2. Qt が Linux のデバッグ/リリース フォルダーに出力ファイルを作成しない

  3. Docker bash プロンプトでカラー出力が表示されない

  1. Linux コンソールで、出力をラップしない方法

  2. リダイレクト時にclangが理解できないテキストを生成するのはなぜですか?

  3. pwd は何を出力しますか?

  1. ターミナルプロンプトが正しくラップされていませんか?

  2. 自動リピートが機能しない

  3. docker run の出力で入力デバイスが TTY ではないというのはどういう意味ですか?