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
て変更してコマンドを再実行できます。前のコマンドをインタラクティブに編集できるほど良くはありませんが、私の要件には十分だと思います。