質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
zsh

zshは、UNIX系OSのシェルの1つです。 cshやksn系のコマンドライン編集機能も実装されたシェルです。

Q&A

解決済

2回答

1142閲覧

zshの履歴ファイル HISTFILE に日本語が含まれているとエンコードがおかしくなるが、それを解析して実行したい

noc

総合スコア73

zsh

zshは、UNIX系OSのシェルの1つです。 cshやksn系のコマンドライン編集機能も実装されたシェルです。

0グッド

2クリップ

投稿2022/04/20 01:37

編集2022/04/20 22:52

zsh の履歴ファイルの中の特定の一行(fzf で選択などする)を、日本語が含まれているのなら正確な utf-8 に戻して閲覧したり、実行したりできるようにしたいです。しかし、特殊なエンコードが使われているようで難しいです。

LANG="ja_JP.UTF-8" で、zsh の履歴ファイル HISTFILE はエンコード的には utf-8 のように見えますが、metafy という特殊なエンコードが行われているらしく、日本語を含む文字列は文字化けします。

参考:

shell

1% echo "echo 'あいうえお'" | od -t x1 20000000 65 63 68 6f 20 27 e3 81 82 e3 81 84 e3 81 86 e3 30000020 81 88 e3 81 8a 27 0a 40000027 5 6# unsetopt extended_history (履歴に時刻を記述しない設定)にて 7% cat $HISTFILE | tail -n 1 | od -t x1 80000000 65 63 68 6f 20 27 e3 81 82 e3 81 83 a4 e3 81 83 90000020 a6 e3 81 83 a8 e3 81 83 aa 27 0a 100000033

御覧の通り、日本語部分の随所に *3 a* が含まれてしまいます。
そのけっか、そのまま閲覧しようとすると

echo 'あぃ?ぃ?ぃ?ぃ?'

のようになってしまいます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

noc

2022/04/20 10:48

ありがとうございます。その記事で紹介されている zhistconv を使うことで解決しました。
guest

回答2

0

わざわざヒストリファイルの中身を読むのではなく、zshの内部コマンド fc でヒストリ自体を表示するのでは駄目なのでしょうか?
ヒストリ番号の表示なしでヒストリの最初から表示したい場合は fc -ln 1 で表示出来ます。

シェルスクリプトの中だとヒストリファイルが読み込まれていないので表示できませんが、その場合は先に fc -R でヒストリファイルを読み込んでおけば表示できます。
同様に他のシェルから使いたい場合も zsh -c 'fc -R; fc -ln 1' とすれば大丈夫です。

投稿2022/04/20 13:52

doda

総合スコア947

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

https://github.com/ikorihn/zhistconv を使うと履歴ファイルをうまく読めるように変換できました。

shell

1$ zhistconv parse "$HISTFILE" | fzf

投稿2022/04/20 10:47

noc

総合スコア73

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問