web-dev-qa-db-ja.com

bash履歴を使用して前のコマンドを取得し、それをコピーして、コマンドをコメント化して「実行」します

bashスキルを向上させるための質問です。私はいつもこれをします:

$ history | grep some_long_command

...
...
123 some_long_command1.........
124 some_long_command2.........
...

その後、次のようにして見つけたコマンドを実行できます:

!123

しかし、私はしばしばこれをしたいです:

some_long_command1foobar

つまり実行する前にコマンドを変更します。代わりにbashを使用してこのコマンドを実行できますか?

#some_long_command1

コメントが付けられます。

その後、マウスを使用してコマンドを強調表示し、編集して実行する必要はありません(キーボードを使用するだけで済みます-高速)。

私はそれを行うためのスクリプトを書くことができると思いますが、既にどこかに機能が組み込まれているかもしれません。

ありがとうございました。

76
ale

Historyコマンドを使用する代わりに、ctrl+rを使用して、そのコマンドの入力を開始することをお勧めします。変更するように矢印キーを押すと、オートコンプリートの認識が終了し、実行する前に編集できるようになります。

更新:また、入力したばかりの文字列を含むさまざまなコマンドを繰り返し実行する場合は、ctrl+rを押し続けます

138
Miquel

実際には、:pコマンドを実行して、実際に実行せずに印刷します。例えば:

$ ls -la
$ !!:p

印刷ls -laを実行せずに前のコマンドとして使用します。  (上)見つけて編集します。

あなたもできる

!123:p

123番目のコマンドを前のコマンドとして出力します。

59
joeschmidt45

fcコマンドを試して、履歴内のコマンドを編集することもできます。

WIKIによると

fcは、以前に対話型シェルに入力されたコマンドを一覧表示、編集、再実行するUnixの標準プログラムです。 fcは、bashシェルのbuilt-inコマンドです。 help fcは使用情報を表示します。


逆インクリメンタル検索Ctrl+R)、さらにいくつかのbashショートカットがあります:

man bashから:

前史(C-p)
履歴リストから前のコマンドを取得し、リストに戻ります。 
ネクストヒストリー(C-n)
履歴リストから次のコマンドを取得し、リスト内を前方に移動します。 
歴史の始まり(M- <)
履歴の最初の行に移動します。 
履歴の終わり(M->)
入力履歴の最後、つまり現在入力中の行に移動します。 
逆検索履歴(C-r)
現在の行から後方に検索し、必要に応じて履歴を「上」に移動します。これはインクリメンタル検索です。 
前方検索履歴(C-s)
現在の行から前方に向かって検索し、必要に応じて履歴を「下に」移動します。これはインクリメンタル検索です。 
非増分逆検索履歴(M-p)
ユーザーが指定した文字列の非インクリメンタル検索を使用して、現在の行から始まる履歴を逆方向に検索します。 
非増分フォワード検索履歴(M-n)
ユーザーが指定した文字列の非インクリメンタル検索を使用して、履歴を前方検索します。
yank-nth-arg(M-C-y)
前のコマンドの最初の引数(通常は前の行の2番目のワード)をポイントに挿入します。引数nを使用して、前のコマンドのn番目の単語を挿入します(前のコマンドの単語はWord 0で始まります)。負の引数は、前のコマンドの最後からn番目のWordを挿入します。引数nが計算されると、引数は「!n」履歴展開が指定されたかのように抽出されます。
yank-last-arg(M-。、M-_)
前のコマンドの最後の引数(前の履歴エントリの最後の単語)を挿入します。引数を指定すると、yank-nth-argとまったく同じように動作します。 yank-last-argを連続して呼び出すと、履歴リストに戻り、各行の最後の引数が順番に挿入されます。履歴展開機能は、「!$」履歴展開が指定されているかのように、最後の引数を抽出するために使用されます。 
シェル拡張ライン(M-C-e)
シェルのように行を展開します。これにより、エイリアスと履歴の展開、およびすべてのシェルワード展開が実行されます。履歴展開の説明については、以下の履歴展開を参照してください。 
履歴展開行(M- ^)
現在の行で履歴展開を実行します。履歴展開の説明については、以下の履歴展開を参照してください。
最後の引数を挿入(M-。、M-_)
 yank-last-argの同義語。 
次の操作と取得(C-o)
現在の行を受け入れて実行し、編集のために履歴から現在の行に関連する次の行をフェッチします。引数は無視されます。 
編集および実行コマンド(C-xC-e)
現在のコマンドラインでエディターを起動し、結果をシェルコマンドとして実行します。
18
!123:gs/old/new/

文字列「old」を文字列「new」に置き換えてコマンド123を実行します。

10
John Lawrence

M- ^(Macではoption-shift-6)を押すと、編集モードになります。

これを入力してください:

!123M- ^

そして、コマンド#123を編集します。 ctrl-rを使用するようなものですが、感嘆符の構文から始めます。

6
James Moore

historyコマンドを使用する代わりに、history-search-backward/history-search-forward簡単に覚えられるキーショートカット(PgUp/PgDownを好む)。これを行うには、これを.inputrcファイル:

"<key code>":  history-search-backward
"<key code>":  history-search-forward

取得するため <key code>、タイプCtrl-V <key>シェルで、開始^[ with \e出力されたものは何でも。

これを設定したら、someと入力してPgUpを押すとsome_long_command。必要な場合some_long_command with_some_argただし、同様のコマンドがありますsome_long_command with_some_other_arg履歴の後半で、someと入力してからPgUpを繰り返し押すか、またはsomeと入力してPgUpを押し、カーソルを2つのコマンドが異なり始め、数文字を入力して、もう一度PgUpを押します。類似のコマンドをすばやくページング/区別するこの機能により、Ctrl-R

4
Tgr

また置くことができます

shopt -s histverify

あなたの.bash_profileを使用すると、コマンドラインで履歴展開を実行せずに表示し、編集前に編集することができます。

3
chepner

「提案ボックス」のような履歴を試してみたいと思うかもしれません https://github.com/dvorka/hstr -Bash履歴を読み取り、迅速なナビゲーションを可能にします。

hh

最後のコマンドを取得するには、hhと入力し、コマンドに移動し、右矢印を使用してコマンドラインで取得します(編集またはコメントの追加が可能)。

1
Martin Dvorak

^ pは、unix/solarisで最後に入力されたコマンドを取得します

0
SudhakarM

プット

エイリアスr = 'fc -s'

.bashrc(ホームディレクトリ)に入力するだけで

r <whatever>

コマンドプロンプトで、履歴にある最後の<whatever>コマンド(同じパラメーター)のコピーを実行します。必要に応じて矢印を押して、実行した内容を確認してください。

0
chuck