KSHには奇妙な歴史があります

KSHには奇妙な歴史があります

x86のRHEL 2.6でKSHを実行しています。 KSHのバージョンは次のとおりです。

sh (AT&Tリサーチ) 93u+ 2012-08-01

Bashに切り替えたり、Tcsh(以前の職場でお気に入りで使用していた)に戻すことはできません。

KSHについて私が見つけた最初の迷惑なことは、時々上のキーを使用してレコードをスクロールすると、他の端末(一度に複数の端末が開いている)の記録が混在することです。その後、すべての端末がHISTFILEを共有していることがわかりました。いいのに、いつも一緒に混ざらないのがまだ変です。また、HISTFILEが常にすぐに更新されるわけではないことも確認しました。結局のところ、KSHはおそらくいくつかのコマンド履歴をバッファリングし、定期的に内容をHISTFILEにフラッシュしていることを確認しました。この動作に関するドキュメントはどこにも見つかりませんが、合理的な説明のようです。

私は各セッションが異なるレコードを持つことを望んでいたので、これを.kshrcファイルに追加しました:

HISTFILE=~/.hist.$(tty | sed 's;.*/;;')

各端末に固有のHISTFILEを提供する必要があります。それは素晴らしいです。ところで…これらの履歴ファイルは定期的に削除されるようです。現在、ほとんどのファイルサイズは0バイトです。

修正する: 開いているすべての端末のさまざまな履歴ファイルは10分ごとに削除されます。定期的な。

前にこれを見た人はいますか? ? ?

修正する:2年が過ぎた今でも答えはまだ遠いです。最近とても迷惑しました。私はkshのソースコードを調べ始めましたが、私はハードウェアデザイナーであり、コメントが少なく、非常に難しいです。

まあ、それが手がかりかもしれませんね。私の履歴ファイルのすべての行は^ @文字(emacsでレンダリングされています)で始まります。これは、0x40(@文字)+ 0x80(制御ビット)= 0xc0 = 8進数300を意味すると思います。私が知る限り、history.cで言及されている唯一の特殊文字は0201と0202です。私の履歴ファイルは\ 201で始まります(つまり、emacsでレンダリングすると8進数のようです)。

以下は、一般的な履歴ファイルの例です。普通に見えますか?

�ls
 pwd
  clear
  ls
 ls
 tty

さて、これらの制御文字は正しく表示されません。次のように通常の文字に変換されます。

\201^Als
^@pwd
^@^@clear
^@^@ls
^@ls
^@tty
^@^@

時々2つの^ @文字が表示され、時には1つが表示されますが、理由を理解できません。これは手がかりではないかもしれませんが、今は他の手がかりはありません。

修正する: 解決しました!わかりました、ほとんど終わりました。この記事を投稿するとすぐに、私は歴史の中で他のものを検索し始めました。私はこれを見ました:

/*
 * clean out history file OK if not modified in HIST_RECENT seconds
 */
static int hist_clean(int fd)
{
    struct stat statb;
    return(fstat(fd,&statb)>=0 && (time((time_t*)0)-statb.st_mtime) >= HIST_RECENT);
}

当然、HIST_RECENTは600に設定されていますが、これは私が探している間隔である10分です。無効にする方法がよく見つかりませんでしたが、いくら嫌いでも意図的な動作のようです。

ベストアンサー1

はい、シェルが終了してもksh93コマンドライン履歴をファイルに書き込みます。bashそれでも掘り下げて一部のソースコード、メモリ内の履歴バッファが4k(HIST_BSIZEコード内)であるようですが、いっぱいになったとき、または特定の数のコマンドの後にフラッシュするかどうかはわかりません(誰がHIST_MARKSZこのコードで何でもできますか?)。

はい、多くの対話型セッションがHISTFILE同じ設定を使用している場合は、履歴を共有します。これは文書化されています(私の強調):

コマンドを再入力してください。

端末デバイスから入力された最後の(デフォルトは512)コマンドのテキストが履歴HISTSIZEファイルに保存されます。変数が設定されていない場合、または名前付きファイルが書き込み可能でない場合は、 $HOME/.sh_history そのファイルが使用されます。HISTFILEシェルは、同じ名前を使用するすべての対話型シェルのコマンドにアクセスできますHISTFILE

履歴ファイルは指定されたサイズに保持されますが、HISTSIZE発生したときに定期的に切り捨てられません。あなたに何が起こっているのか、私は考える、対話型シェルセッションごとにtty一意のファイルを設定するため、HISTFILE対話型セッションを終了して再開すると、シェルが接続されているTTYによっては「正しい」履歴ファイルが選択または選択されないことがあります。

シェルセッションに新しいTTY(以前のセッションで使用されたことのないTTY)が割り当てられると、その履歴ファイルは自然に空になります。

おすすめ記事