コマンド履歴の変更を元に戻す方法は?


12

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

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

キーを使用してアクセスした履歴のコマンドへの変更を「元に戻す」方法はありますか?

現在の回避策は#、コマンドの前にa を付加することです。このように、現在のコマンドはコメントとして実行されるため、何も起こりません。その後、キーを使用してコマンドをもう一度参照できます。問題は、私が使用していたコマンドがリストの中で遠く離れている可能性があることです。そのため、もう一度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

コマンド履歴が変更されることは、おそらく使用しているシェルの(誤った)機能です。ではksh、たとえば、あなたがエントリの「以前のバージョン」を削除せずに履歴エントリを編集し、それらを呼び出すことができます、。すべての呼び出されたコマンドが利用可能です。
Janis

「それが変わる」とは、つまり、以前のコマンドを矢印で到達した後に変更した場合、矢印で上下に移動すると、古いコマンドではその方法が表示されませんが、変更した方法はそれ。もちろん、コマンドを実行して「Enter」と入力すると、その古いコマンドは最初と同じになります。しかし、これはまさに私が回避しようとしていて、コマンドを初期値に「リセット」する方法を探しているものです。
fedorqui 2015

1
この場合も、kshここでの振る舞いが違うようです。また、履歴編集オプションは、選択した編集モードによって異なります。kshviのモード、例えば、古いエントリが上書きされていない、と私はまたのように、アンドゥコマンドを発行することができviて、 『U』。
Janis

うーん、これは非常に有望に聞こえます。私は現在バッシュで働いており、現在に変更するkshことは考えていませんが、そのようなものがそこに存在することを知っておくのは良いことです。
fedorqui 2015

シェルが閉じているときに履歴ファイルに書き込む前に、bashが最近のコマンド履歴をどこに保存するのか知りたいのですが。これが可能かどうかを判断するのに役立ちます。誰か?シェル変数の1つにあるのではないかと思ったのですが、今はマニュアルをざっと見る時間はありません。
iyrin 2015

回答:


10

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


5

行に複数の変更を加えたら、元のコマンド戻します。

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まで書き込まれないため、「元に戻す」ことはできません。あなただけのことができないので、私はこれを言及する理由は、1等が期待するかもしれないし、シェルを終了するには理想的ではないかもしれません。grep$HISTFILE

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

コマンドの一部を覚えている場合は、ctrl + rを押して、覚えているものを入力して、その文字列を含む以前のコマンド検索します。もう一度ctrl+を押すとr、逆方向に検索して、次に新しいものが表示されます。

たとえば、前に探していたコマンドを見つけるのに必要な回数だけ、ls -lthen 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 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が求めている「元に戻す」ソリューションよりも「やらない」ことの方が近いとしても、密接に関連していると思われるので、単にそれを捨てます。


これは素晴らしいです。詳細な情報をありがとうございます。Gillesの回答は、私が探しているものと完全に一致するので受け入れますが、ここでは、やり直したいコマンドについて多くのことを知っていると想定していますが、常にそうとは限りません。
fedorqui

ええ、同意します。元に戻す機能を以前に私が何らかの方法でコマンドを入力したものに拡張できたら素晴らしいと思います。
iyrin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.