履歴からコマンドを実行する方法はありますか?


99

例えば:

[root@ip-10-0-7-125 ~]# history | grep free
  594  free -m
  634  free -m | xargs | awk '{print "free/total memory" $17 " / " $ 8}'
  635  free -m
  636  free -m | xargs | awk '{print "free/total memory" $9 " / " $ 10}'
  736  df -h | xargs |  awk '{print "free/total disk: " $11 " / " $9}'
  740  df -h | xargs |  awk '{print "free/total disk: " $11 " / " $8}'
  741  free -m | xargs | awk '{print "free/total memory: " $17 " / " $8 " MB"}'

636コマンドをもう一度入力せずに実行する方法があるかどうか、疑問に思っているだけです。履歴636などのように、何かと数字を入力するだけです。



1
うん、私はそれを知っていますが、それは私が望むものとは正確に異なります。
1つの

回答:


170

bashでは、!636大丈夫です。


12
In Linux-これは、人が実行しているシェル(bash、zshなど)と、それを実行しているOSに関連しています。Linuxには、履歴をサポートしないシェルがあります。
ゾレダチェ

@Zoredache同様に、これはWindowsでのbashのほとんどの実装で正常に機能します。
Ajedi32

1
もちろん、bashだけでなく、cshなどの他のシェルも同様です。
ドリュー

5
実行したいコマンドと非常によく似たコマンドがある場合:p!636:p、たとえば、コマンドを実行せずに追加して印刷できます。つまり、上矢印を押して履歴から簡単に再度選択し、必要な小さな変更を加えることができます
AJefferiss

78

はい、それは「履歴拡張」と呼ばれます。見る

LESS='+/^HISTORY EXPANSION' man bash

詳細については。

感嘆符の後に数字を続けることが、おそらく最も簡単な使用法です。

!636

ただし、履歴番号を知らなくても、最後に実行したコマンドを直接実行することもできます。

!!

または、次の2つのコマンドを実行できます。

!-2

ただし、最も頻繁に使用する形式は、最後のコマンドの最後の引数を繰り返すことです。

echo this text goes into a file > /tmp/afile.txt
cat !$

または、ファイルを検査しているとしましょう。タブ補完を使用して、次のことを実行できます。

ls -l /really/long/path/to/some/file
less !$

繰り返しになりますが、詳細についてはmanページをお読みください。

LESS='+/^HISTORY EXPANSION' man bash

25
インタラクティブに、Alt-.よりも便利になり!$ます。最後のコマンドの最後の引数を逐語的に挿入します。
ulidtko

2
@ulidtkoこれらの特別なエスケープはどこに文書化されていますか(私は知っていましたが!$、聞いたことはありませんAlt-.)?リンクを投稿してください。
edmz

5
LESS="+/DEFAULT KEY BINDINGS" man 3 readline/etc/inputrc~/.inputrc。bash以外の多くのプログラムはlibreadlineを使用します。やる人のために、あなたは、同じ機能のように取得するAlt-.Ctrl-X-U(元に戻す)Ctrl-/無料- (ショートカットを記述)、タブ補完など。例えば、ただで3行PYTHONSTARTUPいずれかでタブ補完や履歴を有効にすることができます株式のpython REPL。動作するのはGNU Readlineライブラリであるため、どちらも(ほとんど)bashと同じように動作します。readlineのマンページには、機能の詳細が記載されています。
ulidtko

2
また、Ctl-UpArrow(またはbashのAltUpArrow)は、履歴リストを後方にスクロールします。数文字を入力すると、UpArrowはその文字で始まるコマンドのみを取得します。たとえば、「fr(Ctl-Up)」は、OPのリスト内のすべての「free ...」コマンドをスクロールします。これは、readlineを使用するgnuplot&gdbなどでも機能します。
-jamesqf

2
@ Ajedi32、私の答えの最後の太字の行を参照してください。:)本当に、この答えは、歴史の拡大ができることのほんの少しの味です。これはシェルのレベルであり、呼び出しているコマンドではないことに注意してください。したがって、echo {1..5}続いtouch !$触れる5つのファイルだけでなく、ものを。厳密に言えば、これは最後の引数ではなく、その行の最後のシェルワードです。(echo hello >temp後に続けて試してみてくださいecho goodbye !$。)より明確に配置する方法を考えられる場合は、編集を提案してください。
ワイルドカード

14

最初に履歴を表示したくない場合、番号などに注意してください。

bash(およびおそらく他の)で:

ctrl-r something 

ctrl-r= "インタラクティブに逆検索")(something=前のコマンドの一部)

これにより、を含む最新の履歴行が表示されますsomething。前のものを取得するには、前の行を取得するたびにctrl-r(単独)を再度実行します。

例:

ctrl-r  10

'10'を含む最新の履歴行を表示する(exempleでの行を実行$10する場合)、ctrl-r探している履歴行を取得するまで

あなたが望んでいた行が表示されたら、ちょうどEnterそれを実行する(または、あなたも使用して、それを編集することができarrow keysbackspaceおよびctrl-a、行の先頭に移動するにはctrl-e、エンドに到達するために ctrl-k:カーソルから行の末尾に「殺す」こと(=削除+バッファに保存) ctrl-y、:バッファから以前にキルされたビットなどを復元します)

前方検索(ctrl-s)を行う場合は、まずXONを無効にする必要がありますhttps : //stackoverflow.com/a/791800/1841533を参照してください

"を実行してXON / XOFFを無効にするだけです

stty -ixon

"(そして、ターミナルをフリーズさせずにctrl-sを使用できるようになります)


これを行い、誤ってctrl-rを1回押しすぎた場合、履歴を再度検索する方法はありますか?
カスペルド

@kasperd:はい、できます。seに関する多くの答えがそれを指摘しています:前方検索のためのctrl-s。
オリビエデュラック

残念ながら、ctrl-sは端末をフリーズするために使用され、bashはそれを無効にしないため、デフォルトの構成では機能しません。(他のプログラム
-emacs

@kasperd:はい、それについて以前に言及していないことを残念に思います(彼らはそれを正確に行うため、「多くの答え」を指摘しましたが、コメントにこれを入力したり、リンクを与えたりするのに時間がかかりませんでした... 。。携帯電話は)私は今、帰ってきて、上記の回答でそれを編集することができ、CTRL-Sをbashの履歴検索のためには、最初に-ixon STTYすることができ必要
オリヴィエ・デュラック

このコマンドは、ctrl-sの通常の使用を中断するため、実際にはオプションではありません。
カスペルド

7

シェルの組み込みfcを使用できます。

fc -s 636

2
これは実際に受け入れられている答えより優れていますが-s、利益を得るにはを削除する必要があります。実行fc 636すると、バッファー内の履歴からコマンド636でエディターが開き、コマンドを保存して終了すると(変更されたかどうかに関係なく)実行されます。さらに良いことに、これはPOSIX準拠です。
ワイルドカード

@StevenPennyありがとう。そして、はい、私はPOSIXが何であるかを知っています、しかし、私は関連性を見ません。とにかく、簡単にアクセスして含めることができるドキュメントがあれば便利です。
ファヒムミサ

@FaheemMithaは「help fc」を実行してみてください。
ワイルドカード

@Wildcard helpはPOSIXではありません-やらなければならないことman dashや似ていることがあります
スティーブンペニー

@Wildcardありがとう。help存在することを忘れがちです。別のシェル組み込み。そして、新しいシステムの助けを必要とするかもしれないが、その代わりにぎこちない流れに直面している不注意なユーザーのために不可解です。:-(
ファヒームミタ

3

ありますHSTR- hhのためのコマンドbashzsh対話型コマンドの選択は、Ctrl-R逆探索よりも優れては:

hh対話型履歴コマンドの例

インタラクティブなので、コマンドを実行する前に検索および編集できます。

Ubuntuでは、hh次のワンライナーでインストールできます。

sudo add-apt-repository ppa:ultradvorka/ppa && sudo apt-get update && sudo apt-get install hh && hh --show-configuration >> ~/.bashrc

またはステップバイステップ:

sudo add-apt-repository ppa:ultradvorka/ppa
sudo apt-get update
sudo apt-get install hh

hhFedora、RHEL、またはCentOSにインストールします。

sudo dnf|yum install hstr -y

macOSの場合homebrew

brew install hh

...次に、次のように構成します。

hh --show-configuration >> ~/.bashrc

これにより、デフォルトのCtrl-R動作が置き換えられます。

実行hh --show-configurationして、Bashプロファイルに追加するものを決定します。

Githubのプロジェクトホームページで利用可能なその他の構成オプション:https : //github.com/dvorka/hstr

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.