web-dev-qa-db-ja.com

Bashコマンドの最初のWordをすばやく変更する方法は?

Bashでワークフローを少し改善したいのですが、同じコマンドを別の実行可能ファイルに対して実行したいことがよくあります。

いくつかの例:

Git(2番目のWordをすばやく変更したい場合):

git diff     foo/bar.c
git checkout foo/bar.c

Cat/rm(最初の単語のみを変更する必要がある場合):

cat foo/is/a/very/long/path/to/bar.c
rm  foo/is/a/very/long/path/to/bar.c

私は打つことができることを知っています Ctrl+a その後 Del 最初の単語を削除しますが、より迅速な方法があるかどうか疑問に思っています。

44
nowox

!$は、前のコマンドの最後のWordに展開されます。

だからあなたはできる:

cat foo/is/a/very/long/path/to/bar.c

rm !$

または:

git diff foo/bar.c

git checkout !$

あなたの例はたまたま最後の単語しか繰り返さなかったので、!$はうまくいきました。繰り返したい引数がたくさんあり、最初のWordを変更したいだけの場合は、!*を使用できます。これは、前のコマンドの0番目以外のすべての単語に展開されます。

bash manページの「HISTORY EXPANSION」セクションを参照してください。そこには多くの柔軟性があります。

56
Spiff

Ctrl+a 行の先頭に移動するには、 Alt+d 最初の単語を削除します。

28
jjlin

実際に速くなるかどうかはわかりませんが、 この記事 、特にポイント#3を参照してください。

  1. ^ str1 ^ str2 ^を使用して、前のコマンドの文字列を置き換えます

次の例では、最初にlsコマンドを実行してファイルを確認します。後で、ファイルのコンテンツを表示したいことに気付きました。次に示すように、ファイル名全体をもう一度入力する代わりに、前のコマンドの「ls」を「cat」に置き換えることができます。

$ ls /etc/cron.daily/logrotate

$ ^ls^cat^
cat /etc/cron.daily/logrotate
17
Benguin

Alt+.

前のコマンドのいずれかの最後の部分を繰り返すだけでよい場合は、使用できます Alt+. これは、履歴の最後の行から取得した最後の引数を貼り付けます。

複数回押すと、貼り付けたものを前の行の最後の引数で置き換えます...

例えば。最後の2つのコマンドが次の場合:

cat foo/is/a/very/long/path/to/bar.c
pico foo/is/a/very/long/path/to/SomeWhereElse.c

シェルでrmと書いて、 Alt+. それが表示されます:

rm foo/is/a/very/long/path/to/SomeWhereElse.c

もう一度押すと Alt+. 代わりに表示されます

rm foo/is/a/very/long/path/to/bar.c

等々...

15
Hastur

@jjlinの回答に加えて、次のヒントも参考にしてください。

  • Ctrl+w 左側の単語を削除します
  • Ctrl+k カーソルからコマンドラインの最後まで削除します
  • Ctrl+u カーソルからコマンドラインの先頭まで削除します
  • Alt+b カーソルを1ワード後ろに移動
  • Alt+f カーソルを1単語前に移動します
  • $_には、前のコマンドラインの最後の引数が含まれています

これらの詳細については、bashマンページの「Readlineコマンド名」セクションを参照してください。

例えば:

cat foo/is/a/very/long/path/to/bar.c
rm $_
12
maiki

Viに習熟している場合は、set -o viコマンドを使用して、bash(ほとんどのシェル?)でviバインディングをアクティブ化できます。その後、通常のviキーを使用してコマンドを編集できます。最初の例では、 ^wcw 「diff」を削除してから、チェックアウトに変更します。

コマンドラインを編集するだけでviキーバインディングを学ぶ価値はないかもしれませんが、それらをすでに知っている場合は、それがきちんとした生産性のブースターです。

8
Chaosed0

この猫の皮をむく方法はたくさんあります!

特定の文字列を置き換えるには、^old^new^extraが前のコマンドを受け取り、oldnewに置き換え、extraを追加します。あなたは好きなだけ早く停止するかもしれません。例えば^oldは、oldを空の文字列に置き換え、空の文字列を追加します(基本的にoldを削除し、それ以上何もしません)。

1. ^diff^checkout
2. ^cat^rm

これの特に便利なバリアント:

for i in `seq 1 10`; do echo something complicated; done
# inspect the output to see if it looks right
^echo

特定の単語を置き換えるには、!m:n-pを使用して、コマンドの単語nからpを参照できますm(現在の値から数えるには負の数を使用します)コマンド)。 -pの部分を省略して単一のWordを参照したり、:m-pの部分を省略してコマンド全体を参照したりできます。特殊な形式!!!-1!$は前のコマンドの最後のワード、!*は前のコマンドの引数(Word 0を除くすべて)です。コマンドはかなり便利です。

1. !!:0 checkout !!:2-
2. rm !*

私はこれらの両方をよく使用します。ここではzshが特にいいです。タブを押すと、不可解なものが展開されて、正しく理解できます。

行編集でこれを行う方法もたくさんあります。シェルのキーバインドを読んでください。

6
Daniel Wagner