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/.kshrc
)ksh93
のファイル名に設定します。デフォルトは、$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およびksh93
(pdksh
OpenBSDで)を使用してksh
徹底的にテストされました。私はそれを使用しませんが、派生物であるmksh
ため、pdksh
これはそのシェルでも機能すると思います。
ノートそれと(pdksh
そして)ksh93
bash
履歴ファイルを共有できません。歴史的形式が異なるからです。
bash
for および for ( with in )ksh
のように、および の初期化ファイルを分離した場合、通常は問題になりません。 (一般的に)を見ると、さまざまな実装をより差別化できます。.bash_profile
.bashrc
bash
.profile
.kshrc
ksh
export ENV="$HOME/.kshrc"
.profile
ksh
$KSH_VERSION
答え2
しばらく。デフォルトでは、KSHはコマンド履歴を繰り返す矢印キーを許可しません。
この質問を見てください:
チームの答え:
矢印キーの場合は、それを
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のおかげで):ソーシング時にバックティックのアイテムを削除しました。私はこれのために誤解を受けました:
$HISTFILE
環境変数がファイルを指していることを確認してください。
私は持っpdksh
ています。マニュアルページ:
注:HISTFILEを設定しないと、履歴ファイルは使用されません。これは、今後$ HOME / .sh_historyを使用する元のKornシェルとは異なります。 pdkshはデフォルトの履歴ファイルも使用できます。
mksh
このため同じ:
注:HISTFILEを設定しないと、履歴ファイルは使用されません。これはAT&T UNIX kshとは異なります。
mypdksh
とmyの両方がファイルmksh
として使用されることに注意してください。また、RTFM() に関しては、実装で他のものを使用できます。 (ヒントをくれたKusalalanandaに感謝します)$HOME/.mkshrc
.kshrc
man 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」ファイルの所有権と権限です)。 ^_^