前のコマンドの引数を使用するにはどうすればよいですか?


287

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

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

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

また、私たちが継続的に押すことで、最後の引数で行うことができますように、前のコマンドの0番目の引数を反復処理についてEsc+の.

回答:


284

同じようにM-.(メタドットまたはESC-ドットまたはALT-ドット)readlineの関数でありyank-last-argM-C-y(メタ制御-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- 3 Alt- Ctrl-y

プレスAlt- - 2 Alt- Ctrl-y

今あなたは見るでしょう:

$ echo ace

ちなみに、echo引数0を選択してを行に追加することもできます。

プレスAlt- 0 Alt- Ctrl-y

編集:

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

あなたは押すことができますAlt- 0を繰り返し押しAlt- .ステップへの前のコマンド(引数0)を介して。同様にAlt- -その後、繰り返しAlt- .あなたは前の最後から引数をステップ実行することができるようになります。

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

頻繁に使用する特定の組み合わせがある場合は、マクロを定義して、1回のキーストロークでそれを実行できます。この例では、押して、前のコマンドから二番目の引数を思い出しますAlt- - 。Shift Yこのキーストロークの代わりに、使用可能なキーストロークを選択できます。繰り返し押すと前のステップに戻ります。

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

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

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

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

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


14
bash / readlineのキーボードショートカットを探すときは、実行bind -lpして現在のバインディングを確認するのが好きです。
チャドスキーター、2014年

1
@ChadSkeeters:そして-s(Bash 4の新機能)はを使用して作成されたマクロをリストします-x
追って通知があるまで一時停止。

digit引数も使用できることに注意してくださいM-.Alt-3 Alt-Ctrl-yの例では、保持等しいためAltとタイピング3.3.リリースせずに複数回入力する場合Altは、前のコマンドラインの3番目の引数を使用します。
デザート

@デザート:2番目の段落で同じように言ってから、例を示します。
追って通知があるまで一時停止。

@ChadSkeeters、何百ものエントリがあるという警告をありがとう!笑。
jdk1.0

309

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


115
!:33番目のものを取得します
Matt Dodge

108
!*は、emのすべてを取得します
wonton

75
!!最後のコマンド全体を取得します。使用するのを忘れた場合に役立ちますsudo
Un3qual 2017年

43
!:1-2最後の3つの引数を除くすべてを取得
Tyler Brock

5
警告の言葉-のような結合された引数を使用する場合echo foo{,bar} baz、コマンドは印刷されたものとして記録され、後で展開されます。上記では、echo !:1afterを次のように解決しecho foo{,bar}てから展開しますecho foo foobar
Sean

200

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


最後から2番目のアイテムを取得する方法はありますか?すなわちfile3から得るmv file1 file2 file3 target/
チャーリーハーディング

3
私はこの回答がとても好きで、完全を期すために、前のコマンドから前のコマンドにアクセスできるようにする '!-2'構文を示す行も追加することをお勧めします。
bbv

1
@bbvまた、より完全にするために、履歴の2番目のエントリにアクセスできるコマンド '!2'を使用します(履歴の設定によっては、それがまだ使用可能な場合)。各プロンプトに履歴番号を表示する場合に役立ちます。
816-8055

53

@larsmansの回答が好きだったので、もっと学ぶ必要がありました。この回答を追加して、他の人がmanページのセクションを見つけ、グーグルの目的を理解できるようにします。

$ 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.

18

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


7
上記で提案されている!:nです
セルジュ

のようにn番目の最後の項目を取得する方法はあり!:nますが、最初ではなく最後から数えますか?
チャーリーハーディング

14

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


$ 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


4

Ubuntu 18.04でテスト済み


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

  • Alt+.:最後のコマンドから最後の引数を挿入します。
  • Alt+ #+ .:最後のコマンドから#n番目の最後の引数を挿入します。
  • Alt+ -#Alt+ .zshの: Alt + -+ #+ .:最後のコマンドからの最初の引数#nthのインサート。

Linuxでは、コマンドを繰り返して履歴に戻ることができます

例:

最後のコマンドは:

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

一般的なショートカット

  • Ctrl+ w:カーソルから最後の単語を削除します
  • Alt+ d:カーソルから次の単語を削除します
  • Ctrl+ k:カーソルの後のすべてを切り取ります
  • Ctrl+ uzsh: Alt +w:カーソルの前のすべてを切り取ります
  • zshの: Ctrl + u:コマンド全体をカット(あなたは組み合わせることができますbashのではCtrl+ uCtrl+ k
  • Ctrl+ y:以前にCtrl+ uおよびCtrl+で切り取った文字を貼り付けるk
  • Ctrl+ _:最後の編集を元に戻す+ を超える場合に非常に役立ちますCtrlw
  • Ctrl+ left:最後の単語に移動
  • Ctrl+ right:次の単語に移動
  • 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/3163120

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

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

私はこの要点でこれを最新に保っていますhttps://gist.github.com/madacol/da38e42d7e45c2949a9f425cc20543e9


1
Alt .Zshの上でMac上で入力され🤔
アンドレ・ペーニャ

1
ESC 。最後の1つだけで機能しますが、機能します。入力を続けて過去に戻ることはできません。多分それは答えを更新する価値があるでしょう。どうもありがとうございました。
アンドレ・ペーニャ

zshで実行するとbindkey -Lバインドされているすべてのショートカットを確認できます。おそらく、問題を特定するのに役立つだけでなく、他の有用なコマンドを見つけることもできます。たとえば、私の場合:バインディングAlt .はとして定義されていbindkey "^[." insert-last-wordます。 Ctrl L(画面をクリアするには)-> bindkey "^L" clear-screenAlt+Ctrl h-> bindkey "^[^H" backward-kill-wordCtrl w最後の単語を削除するのと同じ)
Madacol

@Madacolバインドキーで、前述のcopy-earlier-wordを確認することもできます bindkey "^[^_" copy-prev-word
kikeenrique

3

基本的に、以前の(コマンドの)引数をヤンクするのに使用します

たとえば、次のコマンドが発行されたとします。

echo Hello, world how are you today?

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

Alt+6 に続く Ctrl-Alt-6


Ctrl伝統的な帽子の文字と表記された^キー名の前に付け、およびAltとしてM-それであるMの ETAの接頭辞。

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


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

echo Hello, world!

^Hello^Bye

Bye, world!

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

Hello, world! Hello, people!

^Hello^Bye

結果は:

Bye, world! Hello, people!

2番目の一致(hello)は変更しません。

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


上記は、以下のショートカットです。

!:s/Hello/Bye

前のコマンドで最初に見つかった(一致した)文字列のイベントレベル(*)置換、を有する第1の部分を前置しながらgスイッチに適用される全ライン G lobally

echo Hello, world! Hello, people!

!:gs/Hello/Bye

Bye, world! Bye, people!

通常、他の関連するコマンドで行われているsedviとでregex検索するスタンダール道( - (正規表現)一致文字列)。

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


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

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

神秘的な方法でbashあるBourne-Againシェル(sh発明者の姓からBourneシェルと呼ばれるプレイオンシェル)、サーバーを含む多くのディストリビューション(サーバーOS)のデフォルトシェルであるシェルにいくつかの光が当てられることを願っています



0

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

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

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

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


0

Macを使用している場合、ctrl + letterで拡張文字を取得する傾向があります。端末(iTerm2)のセットアップでメタとして定義されているスペースバーオプションキーを設定しています。つまり、キーを使用して単語ごとに移動し、前のコマンドからパラメーターを取得します。

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