web-dev-qa-db-ja.com

コマンド履歴の変更を元に戻すにはどうすればよいですか?

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

時々、上に行って、もう一度使用したいコマンドを見つけますが、いくつかのバリエーションがあります。そのような変更を行った場合、historyで確認しない限り、元のコマンドを元に戻す方法がありません。

キーを介してアクセスした履歴のコマンドへの変更を「取り消す」方法はありますか?

私の現在の回避策は、#をコマンドに追加します。このように、現在のコマンドはコメントとして実行されるため、何も起こりません。その後、キーを使用してコマンドをもう一度参照できます。問題は、私が使用していたコマンドがリストの中で遠く離れている可能性があることです。そのため、再度200回上に移動することは少しです。 Control + Rも解決策ではありません。私が探していたものを正確に覚えていない可能性があるためです。

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

ls -l /etc/httpd/conf/

今私はその行に行き、それをに変更しました

ls -l /etc/init.d/

enterキーを押しませんでした。さて、ls -l /etc/httpd/conf/再び。

私の環境

$ echo $Shell
/bin/bash
$ echo $TERM
xterm
12
fedorqui

履歴エントリを編集したが押されていない限り Enter まだ、元のエントリに戻るには、繰り返し押します Ctrl+_undoコマンド—それ以上変更しないまで。元のエントリに戻ります。

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

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はメタキーです。 altr 私のために。


不必要でありながら役立つ情報

OPが以前に行ったようなコマンドを実行した場合(それが発生します)、コマンドは GNU Readline ライブラリであり、シェルが終了するまで $HISTFILEには書き込まれません です。私がこれに言及する理由は、期待どおりにgrep$HISTFILEを実行するだけでなく、シェルを終了することが理想的でない可能性があるためです。

したがって、ここに、以前のすべてのreadlineコマンドをスクロールして戻る手間を省くためのオプションがいくつかあります。

コマンドの一部を覚えている場合、 ctrl+r 覚えていることを入力してください 前のコマンドを検索 その文字列を含みます。押す ctrl+r 再び次の最新を表示し、逆方向に検索します。

たとえば、ls -lと入力します。 ctrl+r 以前に求めたコマンドを見つけるのに必要な回数。スクロールすると、 ctrl+s 現在位置から前方検索します。

fc bash組み込みコマンドは、以前のreadlineコマンドとともにインデックス番号を一覧表示するのに役立ちます。

fc -l -100は、readlineに前の100個のコマンドをリストします。

さらに、OPは以前のls -lコマンドを探していることを知っている場合、次のように出力をgrepにパイプすることができます:fc -l -100 | grep 'ls -l'

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

これで、イベント指定子!nを使用できます。ここで、nはインデックス番号です。この例では、!2065を実行するとls -lに展開されます。


それは事実の後で助けにはなりませんが、以前のコマンドを変更するときに最近のコマンド履歴を保持したい人はHISTORY EXPANSIONman 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が求めている「元に戻す」ソリューションよりも「しない」ことの方が近いとしても、密接に関連していると思われるので、単にそれを捨てます。

5
iyrin