331

Esc+.は、最後のコマンドの最後の引数を与えることを知っています。

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

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

また、前のコマンドの 0 番目の引数を反復処理するのはどうでしょうか? Esc+を連続して押すことで最後の引数を処理できます。.

4

11 に答える 11

372

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

于 2013-01-06T16:12:06.050 に答える
304

M-.(meta-dot または esc-dot または alt-dot) が readline 関数であるようyank-last-argに、M-C-y(meta-control-y または esc-ctrl-y または ctrl-alt-y) は readline 関数yank-nth-argです。を指定nしないと、前のコマンドの最初の引数がヤンクされます。

引数を指定するには、Escape と数字を押すか、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- 3 Alt- Ctrl-y

押すAlt- - 2 Alt- Ctrl-y

次のように表示されます。

$ echo ace

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

押すAlt- 0 Alt- Ctrl-y

編集:

元の質問に追加した質問に答えるには:

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

履歴の特定の行に適切な議論がない場合、ベルが鳴らされます。

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

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

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

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

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

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

于 2010-10-24T20:04:06.713 に答える
253

最初の引数を使用するには、!^またはを使用できます!: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-は、最後の引数が含まれていないため、やや直感に反しています。

于 2015-09-01T13:16:05.077 に答える
62

@larsmansの回答がとても気に入ったので、もっと学ばなければなりませんでした。この回答を追加して、他の人がマニュアルページセクションを見つけて、何をグーグルで検索するかを知るのに役立ちます:

$ 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.
于 2014-07-10T09:18:40.013 に答える
18

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

于 2010-10-24T17:26:11.147 に答える
1

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

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

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

前のコマンド全体を挿入するには、次のように入力します!!\e^\e^ですhistory-expand-line

于 2015-12-06T15:27:55.510 に答える