web-dev-qa-db-ja.com

前のコマンドの引数を使用する方法は?

そんなこと知ってる Esc + . 最後のコマンドの最後の引数を提供します。

しかし、最後のコマンドの最初の引数に興味があります。そうするためのキーバインディングはありますか?

同じ行に、最後のコマンドからn番目の引数を取得する一般的な方法はありますか? bashスクリプトでは、$0$1などを使用できることを知っていますが、これらはコマンドラインでは機能しません。

また、前のコマンドの0番目の引数を繰り返し処理する場合は、連続してを押すことで最後の引数でできるように Esc + .

256
Aman Jain

M-.(メタドットまたはesc-dotまたはalt-dot)がreadline関数yank-last-argM-C-y(meta-control-yまたはesc-ctrl-yまたはctrl- alt-y)はreadline関数yank-nth-argです。 nを指定せずに、前のコマンドの最初の引数をヤンクします。

引数を指定するには、Escキーと数字を押すか、Altキーを押しながら数字を押します。できるよ Alt--負の数の指定を開始するには、Altを放して数字を押します(これは引数のリストの最後からカウントされます。

例:

次のコマンドを入力してください

$ echo a b c d e f g
a b c d e f g

次に、次のプロンプトでecho(スペースを追加)と入力し、次に

押す Alt-Ctrl-y 表示されます:

$ echo a

押さずに Enter まだ、次を行います

押す Alt-3Alt-Ctrl-y

押す Alt--2Alt-Ctrl-y

今、あなたは表示されます:

$ echo ace

ところで、引数0を選択することにより、行にechoを置くことができます。

押す Alt-Alt-Ctrl-y

編集:

オリジナルに追加した質問に答えるには:

押すことができます Alt- その後、繰り返し押します Alt-. 前のコマンド(arg 0)をステップ実行します。同様に Alt-- その後繰り返し Alt-. 前の最後から2番目の引数をステップスルーできます。

履歴の特定の行に適切な引数がない場合、ベルが鳴ります。

頻繁に使用する特定の組み合わせがある場合は、1つのキーストロークで実行されるようにマクロを定義できます。この例では、前のコマンドの2番目の引数を呼び出します。 Alt-Shift-Y。このキーストロークの代わりに、使用可能な任意のキーストロークを選択できます。繰り返し押すと、前のステップをステップスルーできます。

試してみるには、Bashプロンプトでマクロを入力します。

bind '"\eY": "\e2\e."'

永続的にするには、次の行を~/.inputrcファイルに追加します。

"\eY": "\e2\e."

残念ながら、これはarg 0または負の引数番号では機能しないようです。

264

!$は、前のコマンドライン引数の最後の要素を取得します。

287
user1953081

最初の引数を使用するには、!^または!:1を使用できます

例:

$ echo a b c d e 
a b c d e
$ echo !^
echo a
a

$ echo a b c d e 
a b c d e
$ echo !:1
echo a
a

あなたの質問は他の引数を使用することに関するものなので、ここにいくつかの便利なものがあります:

!^      first argument
!$      last argument
!*      all arguments
!:2     second argument

!:2-3   second to third arguments
!:2-$   second to last arguments
!:2*    second to last arguments
!:2-    second to next to last arguments

!:0     the command
!!      repeat the previous line

最初の4つの形式がより頻繁に使用されます。 !:2-の形式は、最後の引数を含まないため、直感に反します。

178

@larsmansの回答がとても好きだったので、もっと学ぶ必要がありました。この回答を追加すると、他の人がmanページセクションを見つけて、Googleで何をするのかを知ることができます。

$ man  -P 'less -p ^HISTORY\ EXPANSION' bash
<...>
Word Designators

Word designators are used to select desired words from the event.
A : separates the event specification from the Word designator.
It may be omitted if the Word designator begins with a ^, $, *, -,
or %.  Words are numbered from the beginning of the line, with the
first Word being denoted by 0 (zero).  Words are inserted into the
current line separated by single spaces.

   0 (zero)
          The zeroth Word.  For the Shell, this is the command Word.
   n      The nth Word.
   ^      The first argument.  That is, Word 1.
   $      The last argument.
   %      The Word matched by the most recent ‘?string?’ search.
   x-y    A range of words; ‘-y’ abbreviates ‘0-y’.
   *      All of the words but the zeroth.
          This is a synonym for ‘1-$’.  
          It is not an error to use * if there is just one Word in
          the event; the empty string is returned in that case.
   x*     Abbreviates x-$.
   x-     Abbreviates x-$ like x*, but omits the last Word.

   If a Word designator is supplied without an event
   specification, the previous command is used as the event.
50
Ajith Antony

!^は、最初の引数のコマンドです。 n番目を取得する方法があるかどうかはわかりません。

19
Orbit

履歴内の任意のコマンドから引数を取得することもできます!


$ echo a b c d e f g
a b c d e f g
$ echo build/libs/jenkins-utils-all-0.1.jar
build/libs/jenkins-utils-all-0.1.jar
$ history | tail -5
  601  echo build/libs/jenkins-utils-all-0.1.jar
  602  history | tail -10
  603  echo a b c d e f g
  604  echo build/libs/jenkins-utils-all-0.1.jar
  605  history | tail -5
$ echo !-3:4
echo d
d
$ echo !604:1
echo build/libs/jenkins-utils-all-0.1.jar
build/libs/jenkins-utils-all-0.1.jar
13
GuyMatz

基本的に、ヤンクprevious(コマンド)argumentsのヤンクに使用します。

たとえば、次のコマンドが発行された場合:

echo Hello, world how are you today?

次に、Hello,が最初の引数になり、today?6番目になり、最後の引数になります。次のように入力することで参照できることを意味します。

Alt+6 に続く Ctrl-Alt-6


Ctrl 伝統的に、キー名の前に付加される帽子文字^として示されます。 Alt M-つまりMetaプレフィックス。

したがって、上記のショートカットは^Myとしてヤンクに再定義できます。


また、コマンドラインにはhats置換ショートカットがあります。

echo Hello, world!

^Hello^Bye

Bye, world!

前のコマンドの最初に一致した文字列を置き換えるには、次を意味します。

Hello, world! Hello, people!

^Hello^Bye

結果として:

Bye, world! Hello, people!

2番目の一致(hello)を変更せずに残します。

注:帽子の間のスペースのままにしないでください。操作が機能しません。


上記は単なるショートカットです:

!:s/Hello/Bye

前のコマンドで最初に見つかった(一致した)文字列のevent-level(*)置換。最初の部分の前にgスイッチを付けると、行全体globally

echo Hello, world! Hello, people!

!:gs/Hello/Bye

Bye, world! Bye, people!

通常、sedvi、およびregex(正規表現)などの他の関連コマンドで実行される-標準的な検索方法(match文字列)。

いいえ、ここでは!:sg/Hello/Byeまたは!:s/Hello/Bye/gを実行できません。これが構文です!


  • !イベント用です。イベントは、コマンド履歴で実行されるコマンド出力または操作として理解される場合があります。

それを自分で使って、マニュアルページ、ブログ、フォーラムなどのさまざまなソースから読んだものを自分で試してみて理解しました。

bash、Bourne-Again Shell(発明者の姓にちなんでBourne Shellと呼ばれるsh Shell)の不思議な方法に光が当てられることを願っています。サーバーを含む多くのディストリビューション(サーバーOSの)。

3
user4104817

!^は最初のパラメータを取得し、!$は最後のパラメータを取得し、!:nはn番目の要素を取得します。

1

Ubuntu 18.04でテスト済み


前の引数を挿入するには:

  • Alt+.:最後のコマンドから最後の引数を挿入(履歴に戻るために繰り返す)
  • Alt+#+.:最後のコマンドから#n番目の最後の引数を挿入(履歴に戻るために繰り返し)
  • Alt+- 、 # 、 Alt+.zsh: Alt+-+#+.:最後のコマンドから#n番目の最初の引数を挿入(履歴に戻るために繰り返し)

例:

最後のコマンドは次のとおりです。

mv foo bar
  • Alt++.:最後のコマンドの最初の引数を挿入= mv
  • Alt+2+.:最後のコマンドの最後の2番目の引数を挿入= foo
  • up 、 Ctrl+w:最後の単語なしの最後のコマンド= mv foo

一般的なショートカット

  • Ctrl+w:カーソルから最後の単語を削除します
  • Alt+d:カーソルから次のWordを削除します
  • Ctrl+k:カーソルの後をすべてカットします
  • Ctrl+uzsh: Alt+w:カーソルの前のすべてをカットします
  • zsh: Ctrl+u:コマンド全体をカットします(bashでは、結合できます Ctrl+u 、 Ctrl+k
  • Ctrl+y:以前にカットした文字を貼り付けます Ctrl+u そして Ctrl+k
  • Ctrl+_:最後の編集を元に戻す(非常に便利な場合は、 Ctrl+w
  • Ctrl+left:最後の単語に移動
  • Ctrl+right:次のWordに移動する
  • home または Ctrl+a:行の先頭に移動
  • end または Ctrl+e:行末に移動

前のコマンドの引数を反復処理するには

zshでのみ動作します

これを実行するか、~/.zshrcに追加します

autoload -Uz copy-earlier-Word
zle -N copy-earlier-Word
bindkey "^[:" copy-earlier-Word

使用する Alt+. 必要に応じて戻るには、使用します Alt+: 引数を反復処理する

最後のコマンドが

echo 1 2 3 4 5
  • Alt+.5
  • Alt+.+:4
  • Alt+.+:+:3
  • Alt+.+:+:+:2
  • Alt+.+:+:+:+:1
  • Alt+.+:+:+:+:+:echo

ソース: https://stackoverflow.com/a/34861762/316312

利用可能なすべてのショートカットを表示するには

  • bash:bind -lp
  • zsh:bindkey -L
1
Madacol

受け入れられた答えの最後に記載されている方法は、私にとってゼロ番目の引数でも機能します。 ~/.inputrcに次の行があります:

"\en": "\e0\e."
"\em": "\e1\e."
"\e,": "\e2\e."

\e2\e.には、\e2\e\C-yに比べて、前のコマンドの2番目の引数を複数回挿入する代わりに、繰り返し押すと前のコマンドを繰り返すという利点があります。

前のコマンド全体を挿入するには、!!\e^と入力できます。 \e^history-expand-lineです。

0
nisetama