セッション間のkshコマンド履歴を有効にする方法

セッション間のkshコマンド履歴を有効にする方法

kshまたは を実行すると、mksh上矢印は何もしません。

$ ksh
$ ^[[A^[[A^[[A^[[A^[[A

bashしかし、起動しbash、上矢印を押すと動作します。

$ bash
developer@1604:~$ ssh [email protected] -p 2223

ksh または mksh を起動すると、履歴はありません。 $HISTFILE変数も設定しましたが、新しいシェルを起動しても記録はありません。

どうですか? Kornシェルはセッション間の記録を覚えていませんが、bashシェルは覚えていることは本当ですか?

Kornシェルが好きで、より良い、より広範な記録が必要な場合は、kshを介してこの機能を使用できますか?

答え1

いいえ、これは本当ではありません。

ファイル名の場合、$HISTFILEそのファイルにセッション履歴が保存されます。これはマニュアルに記載されています。シェル履歴に記憶されるコマンドの数は値によって制限されます$HISTSIZE

bash私はシェルセッションの終わりではなく、各コマンドの後に履歴がファイルにフラッシュされると思います。これはksh使用する実装によって異なります。

HISTFILEファイルのファイル名~/.profile(ログインシェルから読み取る)または指定ファイル$ENV(対話型シェルから読み込み、デフォルトは$HOME/.kshrcksh93のファイル名に設定します。デフォルトは、$HISTSIZE使用している実装に応じて500、512、またはそれに似ています。kshこれらの変数はエクスポートする必要はありません。これを行う前に履歴ファイルが存在する必要はありません。


コメントでは、特定のEmacsの移動キーとコマンドライン編集キーが機能しないと述べました。これは、シェルがEmacs編集モードにないためです。変数EDITOR(またはVISUAL)をに設定するか、Emacsコマンドライン編集モードを有効にするためにemacs使用します。set -o emacsこれはマニュアルにも記載されています。これらの変数は、シェル以外のプログラムで使用したい場合以外はエクスポートする必要はありません。


要約:

ファイルから$HOME/.profile

export ENV="$HOME/.kshrc"

ファイルから$HOME/.kshrc

HISTFILE="$HOME/.ksh_history"
HISTSIZE=5000

export VISUAL="emacs"
export EDITOR="$VISUAL"
set -o emacs

これはOpenBSDおよびksh93pdkshOpenBSDで)を使用してksh徹底的にテストされました。私はそれを使用しませんが、派生物であるmkshため、pdkshこれはそのシェルでも機能すると思います。

ノートそれと(pdkshそして)ksh93bash履歴ファイルを共有できません。歴史的形式が異なるからです。

bashfor および for ( with in )kshのように、および の初期化ファイルを分離した場合、通常は問題になりません。 (一般的に)を見ると、さまざまな実装をより差別化できます。.bash_profile.bashrcbash.profile.kshrckshexport ENV="$HOME/.kshrc".profileksh$KSH_VERSION

答え2

しばらく。デフォルトでは、KSHはコマンド履歴を繰り返す矢印キーを許可しません。

この質問を見てください:

https://stackoverflow.com/questions/1623256/make-arrow-and-delete-keys-work-in-kornshell-command-line

チームの答え:

矢印キーの場合は、それをpdkshホームディレクトリの.kshrcファイル[(両方とも)]に入れることができます。mksh.mkshrc.kshrc

set -o emacs
alias __A=`echo "\020"`     # up arrow = ^p = back a command
alias __B=`echo "\016"`     # down arrow = ^n = down a command
alias __C=`echo "\006"`     # right arrow = ^f = forward a character
alias __D=`echo "\002"`     # left arrow = ^b = back a character
alias __H=`echo "\001"`     # home = ^a = start of line
alias __Y=`echo "\005"`     # end = ^e = end of line

等号の左側の文字の前には、2 つの下線文字があります。等号の右側の目標は、エイリアスに割り当てられた正しい制御文字を取得することです。スクリプトがこれを行う方法は、コマンドを実行することです(back-tics経由)。

echo "\020"

__Bに割り当てられたcontrol-n文字を取得します。

編集(mirabilosのおかげで):ソーシング時にバックティックのアイテムを削除しました。私はこれのために誤解を受けました:

バラよりhttps://stackoverflow.com/questions/9449778/what-is-the-benefit-of-using-instead-of-backticks-in-shell-scripts

$HISTFILE環境変数がファイルを指していることを確認してください。

私は持っpdkshています。マニュアルページ:

注:HISTFILEを設定しないと、履歴ファイルは使用されません。これは、今後$ HOME / .sh_historyを使用する元のKornシェルとは異なります。 pdkshはデフォルトの履歴ファイルも使用できます。

mkshこのため同じ:

注:HISTFILEを設定しないと、履歴ファイルは使用されません。これはAT&T UNIX kshとは異なります。

mypdkshとmyの両方がファイルmkshとして使用されることに注意してください。また、RTFM() に関しては、実装で他のものを使用できます。 (ヒントをくれたKusalalanandaに感謝します)$HOME/.mkshrc.kshrcman ksh

ちなみに、コマンドを使用してksh履歴をbash_historyに簡単に変換し、strings次のようにsedを使用して設定できます。

strings <history_file> | sed 's/^[ \t]*//' >> $HOME/bash_history

答え3

私の考えで何が起こっているのかは、bashから始まり、矢印を使用してコマンド履歴にアクセスするのに慣れていることです。私が知っている限り、これはKSHではアクティブではありません(ループを通して行われない限り)。 「set -o vi」を使用しない限り、viのカーソル移動およびテキスト編集キーを使用できます。例:<h>左、<j>上、<k>下、<l>右、<i>挿入、<x>文字削除、<d> <w>単語削除など、詳細ここ ただし、「history」コマンドを実行したときにコマンド履歴を表示できる場合は、上記のヒントを使用して履歴を参照できる必要があります。しかし、「history」コマンドが何も出力しない場合は、別の問題になると思います(一般的な問題は「.sh_history」ファイルの所有権と権限です)。 ^_^

関連情報