コマンド履歴の変更を取り消すには?

コマンド履歴の変更を取り消すには?

UNIXシステムでは、上矢印と下矢印を押して前のコマンドに移動できます。これはとても便利です。

時には再利用したいコマンドを見つけますが、少し変更が必要です。そのように変更すると、チェックインしない限り元のコマンドを元に戻すことはできませんhistory

キーストロークでアクセスした履歴からコマンド変更を「元に戻す」方法はありますか?

#現在の回避策は、コマンドの前に を追加することです。これにより、現在のコマンドがコメントとして実行されるため、何も起こりません。その後、キーストロークナビゲーションコマンドを再利用できます。問題は、私が使用しているコマンドがおそらくリストのはるかに下にあるということです。 Control+R も解決策ではありません。なぜなら、私が正確に何を探しているのか覚えていないからです。

はい

次の「50コマンド前」と入力しました。

ls -l /etc/httpd/conf/

次に、その行に移動して次に変更します。

ls -l /etc/init.d/

ところで、エンターキーが押されていません。もう一度申し上げたいですls -l /etc/httpd/conf/

私の環境

$ echo $SHELL
/bin/bash
$ echo $TERM
xterm

答え1

履歴項目を編集してもまだ押されていない場合は、Enter元の項目に戻るには、変更がなくなるまでCtrl+ _(コマンド)を繰り返し押します。undo元の項目に戻ります。

答え2

元のコマンドに戻す行を複数回変更した場合:

revert-line (M-r) 
    Undo all changes made to this line. This is like 
executing the undo command enough times to get back to the beginning.

Mメタキーです。つまりalt</kbd+r for me.


無料だが役に立つ情報

持つ以前にOPなどのコマンドを実行した後、コマンドが実行されてから何も「元に戻す」ことはできません。GNUリードライン図書館に書かなかった$HISTFILEシェルが終了するまで。私がこれを言及する理由は、期待しているgrepことを実行できず、$HISTFILEシェルを終了するのが理想的ではないかもしれないからです。

したがって、以前のreadlineコマンドのすべてを後ろにスクロールするのを防ぐのに役立ついくつかのオプションがあります。

まだいくつかの命令を覚えているならctrl+を押してr覚えている内容を入力してください。前のコマンドの検索この文字列を含みます。ctrl+をもう一度押すと、r次の最新のリバース検索が表示されます。

たとえば、探している以前のコマンドを見つけるには、ls -lthen ctrl+を数回入力します。r過去にスクロールすると、ctrl+sは現在の場所から前方に検索します。

bashfc組み込みコマンド前のreadlineコマンドでインデックス番号を一覧表示すると便利です。

fc -l -100readline の前の 100 個のコマンドがリストされます。

また、OPが前のコマンドを探していることがわかっている場合は、ls -l出力を次にgrepパイプすることもできます。fc -l -100 | grep 'ls -l'

ls -lこれにより、インデックス番号の前に前のコマンドのリストが出力されます。出力は次のとおりです。
2065 ls -l

これで、インデックス番号が!nどこにあるかを示すイベントインジケータを使用できます。nこの例では、実行!2065ls -l


後で役に立ちませんが、前のコマンドを変更するときに最近のコマンド履歴を保存したい人は、履歴を上書きせずに前のコマンドを変更するいくつかの代替方法をHISTORY EXPANSION検討する必要がありますman bash

このEvent Designatorsセクションでは、最近使用したコマンドで文字列を簡単に編集する方法を説明します。

^string1^string2^
              Quick  substitution.  Repeat the previous command, replacing string1 with string2.  Equivalent to
              ``!!:s/string1/string2/'' (see Modifiers below).

例:

$ echo foo
foo 
$ ^foo^bar
echo bar
bar

これで最近のコマンドが表示されます。

echo foo
echo bar

sed上記の例では、イベントインジケータで置換文字列を使用する方法についても説明します。

!-n    Refer to the current command minus n.

したがって、履歴に3つのコマンドがある場合は、echo foo次のようにします。
!-3:s/foo/bar

コマンドが実行されると、イベントインジケータが履歴に表示されます(この場合は)echo bar。それは歴史にそれ自体として現れないでしょう!-3:s/foo/bar

OPが探している「元に戻す」ソリューションよりも「しないでください」に近い場合でも、密接に関連しているように見えるので、これをスローします。

答え3

行変数の読み取りrevert-all-at-newlineBash 4.0/Readline 6.0 から利用可能で、ほぼ期待通りに動作します。

設定されている場合は、任意の行(他のコマンドでも空の行でも)でEnterキーを押すと、編集されたが実行されていないすべての履歴エントリが復元されます(質問の例に示すように)。

これは次のように設定できます。

set revert-all-at-newline on

存在する~/.inputrc

または

bind 'set revert-all-at-newline on'

存在する~/.bashrc

関連情報