以前のbashコマンドのタイプミスを永久に修正するには?

以前のbashコマンドのタイプミスを永久に修正するには?

Bashインタラクティブシェルにコマンドを入力するとスペルエラーが発生することはまれではありません。私は間違ったコマンドがbashレコードを汚染し、後で誤って再実行されることがないようにbashレコードのミスを修正できるようにしたいと思います。特に最後のコマンドを編集したいです。

持つかなり 数字 ~の 質問どうやって聞く防ぐ誤ってbashの履歴を編集しました。私はその反対が欲しい:私は欲しい明らかに履歴を編集します。

参照の質問のいくつかの説明に基づいて、以下を試しました。

$ echo foo

Up次のように変更するにはタップします。

$ echo foobar

押しますDownが、何もしません。その後、押すとEnter変更されたコマンドが実行され、両方が保持されます。

echo foo
echo foobar

私の歴史に。

履歴項目を手動で削除できることはわかっていますが、history -d便利に使用できる良い方法は考案できませんでした。最後の履歴エントリを無条件に削除するシェル関数を作成したくありません。なぜなら、Up最後の項目をロードして修正できるようにしたいからです。変更した後、最後から2番目のレコードを削除することができますが、これは不機嫌で、後で追加の手順を実行する必要があることを覚えているか、このステップの実行を一時的に一時停止する必要があることを覚えておく必要があるため、長期実行コマンドの場合迷惑です。続く。

私が望むもの:

  • 理想的に私ができることは、を押して前のUpコマンドを変更してから特殊キーバインディングを押すか、コマンドラインに魔法フラグを追加して実行時に履歴エントリを置き換えることです。

  • 実行時に履歴エントリを上書きする履歴からコマンドを検索および編集するために別のキーシーケンスを押すことも許可されます(Ctrl + Rと同様)。

  • 強い最後から2番目の履歴エントリを削除するシェル機能は許可されていますが、理想的ではありません。

私は他の人も間違いを犯し、これらの命令が彼らの歴史を汚したときに同じように迷惑をかけたと思います。他の人は何をしますか?

答え1

オプション#1 - 手動

~/.bash_historyエディタでファイルを開き、必要に応じてファイルをvim変更して保存します。

$ vim ~/.bash_history

編集する前に、現在の端末履歴もこのファイルにコミットされていることを確認してください。

$ history -a

履歴ファイルは、この環境変数が指す場所にあります。

$ echo $HISTFILE
/Users/user1/.bash_history

オプション#2 - HSTR

~/.bash_historyより体系的な方法でファイルを管理するために使用できるHSTRというCLIツールがあります。これHSTRメインウェブサイト使い方と動画です。

また、以下の紹介も言及します。

HSTRは、コマンド履歴を管理したり(古い情報や重要な情報を含むコマンドを削除したり)、お気に入りのコマンドをブックマークに追加することもできます。

詳細については、マニュアル全体を参照してください。HSTRファイル

引用する

答え2

高速鉄道魅力的に見えますが、私にとっては重すぎるように見えました。

代わりに、私は独自のbash関数を書いた:

# Removes the last command from the history that matches the given search
# string and re-executes it using the given replacement string.
#
# Usage:
#   historysub SEARCH [REPLACEMENT]
#   historysub -d SEARCH
#
#   REPLACEMENT may be omitted to remove SEARCH from the executed command.
#
#   -d removes the last command matching SEARCH from the history without
#   executing a new command.
historysub()
{
  local delete=0
  local usage=0
  local OPTIND=1
  while getopts ":hd" option; do
    case "${option}" in
      d) delete=1 ;;
      h) usage=1 ;;
      ?) usage=2 ;;
    esac
  done
  shift $((OPTIND - 1))

  local search="${1-}"
  local replacement="${2-}"

  usage_text=
  usage_text+="Usage: ${FUNCNAME[0]} SEARCH [REPLACEMENT]\n"
  usage_text+="       ${FUNCNAME[0]} -d SEARCH\n"

  if (( usage )); then
    echo -e "${usage_text}"
    return $(( usage - 1 ))
  fi

  if [[ -z "${search}" ]]; then
    echo -e "${usage_text}" >&2
    return 1
  fi

  # RE to parse the `history` output.
  local hist_re='^[ \t]*([0-9]+)[ \t]+(.+)$'

  local hist_full
  hist_full=$(HISTTIMEFORMAT="" history)

  # We don't want the search string to accidentally match against history
  # numbers, so split the `history` output so that we can search against just
  # the commands.
  local hist_nums hist_cmds
  hist_nums=$(sed -E "s/${hist_re}/\1/" <<< "${hist_full}")
  hist_cmds=$(sed -E "s/${hist_re}/\2/" <<< "${hist_full}")

  # Find the last matching history entry (excluding ourself).
  local matches last_match
  matches=$(grep -nF -- "${search}" <<< "${hist_cmds}")
  last_match=$(grep -vF -- "${FUNCNAME[0]}" <<< "${matches}" | tail -n 1)

  if [[ -z "${last_match}" ]]; then
    echo "${FUNCNAME[0]}: \"${search}\" not found." >&2
    return 1
  fi

  # RE to parse the `grep -n` output.
  local line_re='^([0-9]+):[ \t]*(.+)$'

  # Note that the line number and the history number might not be the same, so
  # we need to retrieve the original history number.
  local line_num hist_cmd hist_num
  line_num=$(sed -E "s/${line_re}/\1/" <<< "${last_match}")
  hist_cmd=$(sed -E "s/${line_re}/\2/" <<< "${last_match}")
  hist_num=$(tail -n +${line_num} <<< "${hist_nums}" | head -n 1)

  history -d "${hist_num}"
  if (( delete )); then
    echo "Removed: ${hist_cmd}"
    return 0
  fi

  local cmd="${hist_cmd/${search}/${replacement}}"
  echo "${cmd}"

  # Add the new command to the history.
  history -s -- "${cmd}"
  eval -- "${cmd}"
}

これで、コマンドを実行しhistorysub TYPO CORRECTIONて変更してコマンドを再実行できます。前のコマンドをインタラクティブに編集できるほど良くはありませんが、私の要件には十分だと思います。

関連情報