対話型シェルで冗長コマンド履歴をマージする方法は?

対話型シェルで冗長コマンド履歴をマージする方法は?

以前にインタラクティブシェルセッションで使用されていたコマンドを見つけようとすると、次の   (up arrow)結果が表示されることがあります。

$ls         # 1st time push `up arrow`
$ls         # 2nd time push `up arrow`
$ls         # 3rd time push `up arrow`
$ls         # 4th time push `up arrow`
$ls         # 5th time push `up arrow`
$ls         # 6th time push `up arrow`
$make       # 7th time push `up arrow`
$make       # 8th time push `up arrow`
$make       # 9th time push `up arrow`
$ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"   # Bingo!

次のような場合は良いと思います。

$ls         # 1st time push `up arrow`
$make       # 2th time push `up arrow`
$ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"   # Bingo!

重複記録は一般的に役に立たないからです。

Bashでこれを行うにはどうすればよいですか?

答え1

ignoredupsHISTControl変数を設定してこれを実行できます。

HISTCONTROL="ignoredups"

オプションでエクスポートし、

export HISTCONTROL="ignoredups"

環境変数として作成します。 ~からbash(1) マニュアルページ:

HISTCONTROL

    コマンドが履歴リストに保存される方法を制御するコロンで区切られた値のリスト。値リストにが含まれている場合は、ignorespaceaで始まる行スペースキャラクターは履歴リストに保存されません。値を使用すると、以前のignoredups 履歴エントリと一致する行は保存されません。の値はandの略語ignorebothです。値を指定すると、行を保存する前に、現在の行に一致するすべての前の行が履歴リストから削除されます。上記のリストにない値は無視されます。もしignorespaceignoredupserasedupsHISTCONTROL設定されていない場合、または有効な値が含まれていない場合、シェルパーサーによって読み取られたすべての行は、次の値に従って履歴リストに保存されます。 HISTIGNORE。複数行の複合コマンドの 2 行目以降の行はテストされず、値に関係なく履歴に追加されます。 HISTCONTROL

これは実際に正確に質問は何を求めますか?ユーザーがruby …、、、、、、、、、 (別々の連続行で)コマンドを入力すると、履歴リストは、、になりmakeます。 3回押すとコマンドに戻ります。makemakelslslslslslsruby …makels (up arrow)ruby

答え2

@jordanmの答えに追加するには、実際にHISTControlを使用する必要があると思いますが、「削除」値。

「消去された値により、現在の行と一致するすべての前の行が、行を保存する前に履歴リストから削除されます。」

export HISTCONTROL="ignoreboth:erasedups"

~/.bashrcログインするたびに実行されるようにファイルに追加します。

実際、これはすでに回答済み今後

コメントを追加したいのですが、私の評判のためできません。

答え3

~/.zshrcMacos の場合、端末履歴でコマンドの重複を避けるために、ファイルに次の行を追加します。

setopt HIST_EXPIRE_DUPS_FIRST
setopt HIST_IGNORE_DUPS
setopt HIST_IGNORE_ALL_DUPS
setopt HIST_IGNORE_SPACE
setopt HIST_FIND_NO_DUPS
setopt HIST_SAVE_NO_DUPS

答え4

本当に便利なものが見つかりません!

起動時に実行されるbashファイルを作成しましたが、cronを使用してスケジュールすることもできます。 .bash_historyから重複したコンテンツを削除します。

arrVar=()
while read -r line; do
  s=${line# } # remove leading spaces
  s=${line%% } # remove trailing spaces
  if [[ ! " ${arrVar[*]} " =~ " ${s} " ]] && [[ "$s" != history* ]] ;
  then
    arrVar+=("$s")
  fi
done < ~/.bash_history

printf "%s\n" "${arrVar[@]}" > ~/.bash_history

関連情報