如何使用上一个命令的参数?

时间:2010-10-24 17:22:23

标签: bash command-line keyboard-shortcuts input-history

我知道 Esc + 为您提供最后一个命令的最后一个参数。

但我对最后一个命令的第一个参数感兴趣。 这样做是否有关键约束力?

在同一行上,是否有从最后一个命令获取第n个参数的通用方法? 我知道在bash脚本中,您可以使用$0$1等,但这些不适用于命令行。

另外,如何迭代前面命令的第0个参数,就像我们可以通过连续按 Esc + 来完成最后一个参数。

11 个答案:

答案 0 :(得分:276)

!$获取上一个命令行参数的最后一个元素。

答案 1 :(得分:260)

正如M-.(meta-dot或esc-dot或alt-dot)是readline函数yank-last-argM-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 - ÿ

现在你会看到:

$ echo ace

顺便说一下,你可以通过选择参数0来放置echo

Alt - 0 Alt - Ctrl - y

修改

要回答您添加到原文中的问题:

您可以按 Alt - 0 然后反复按 Alt - 以逐步执行上一个命令( arg 0)。类似地 Alt - - 然后重复 Alt - 将允许您逐步执行上一个倒数第二个参数。

如果历史记录中的某一特定行没有适当的参数,则铃声将响起。

如果您经常使用特定组合,则可以定义一个宏,以便一次按键执行它。此示例将通过按 Alt - Shift - Y 来调用先前命令中的第二个参数。您可以选择您喜欢的任何可用按键而不是此按键。您可以反复按此按钮以逐步执行以前的操作。

要试用它,请在Bash提示下输入宏:

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

要使其保持持久性,请将此行添加到~/.inputrc文件中:

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

不幸的是,这似乎不适用于arg 0或负参数号。

答案 2 :(得分:175)

要使用第一个参数,您可以使用!^!: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

更常使用前四种形式。 !:2-形式有点违反直觉,因为它不包括最后一个参数。

答案 3 :(得分:49)

我非常喜欢@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.

答案 4 :(得分:19)

!^可能是第一个参数的命令。我不确定是否有办法获得第n个。

答案 5 :(得分:12)

您还可以从历史记录中的任何命令获取参数!


$ 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

答案 6 :(得分:3)

基本上它可以用于上一个(命令&#39; s)参数

例如,如果发出以下命令:

echo Hello, world how are you today?

然后,Hello,将是第一个参数,而today?第六个,这是最后一个参数;这意味着可以通过键入来引用它:

Alt + 6 后跟 Ctrl-Alt-6

Ctrl 传统上表示为键名称前面的帽子字符^ Alt 表示为 M- > M eta 前缀。

因此,可以将上述快捷方式重新定义为^My以进行抓取。

此外,命令行中还有 hats 替换快捷方式:

echo Hello, world!

^Hello^Bye

Bye, world!

替换上一个命令第一个匹配的字符串,意思是:

Hello, world! Hello, people!

^Hello^Bye

会导致:

Bye, world! Hello, people!

保持第二场比赛(hello)不变。

  

注意:不要在帽子之间留下空格,否则操作无法正常工作。

以上只是以下的捷径:

!:s/Hello/Bye

事件级别(*)替换上一个命令中第一个找到(匹配)的字符串,而为第一个部分添加g开关的前缀将适用于整行 <强> lobally

echo Hello, world! Hello, people!

!:gs/Hello/Bye

Bye, world! Bye, people!

通常在其他相关命令中完成,例如sedviregex(正则表达式) - 一种非常有效的搜索方式(匹配字符串)。

  

不,你不能在这里做!:sg/Hello/Bye!:s/Hello/Bye/g,这是语法

  • !是为了事件;事件可以理解为命令输出或在命令历史记录中完成的操作。

这就是我自己使用它并通过我从各种来源(包括手册页,博客和论坛)阅读的内容自行尝试而理解的内容。

希望它能为bash,Bourne-Again外壳(sh外壳上的一个游戏提供一些神秘的方式,它本身在其发明者的姓氏之后称为Bourne shell ),包括服务器在内的许多发行版中的默认shell是什么(服务器操作系统&#39; )。

答案 7 :(得分:0)

在接受的答案结尾处描述的方法也适用于我的第0个论点。我在~/.inputrc

中有这些行
"\en": "\e0\e."
"\em": "\e1\e."
"\e,": "\e2\e."

\e2\e.优于\e2\e\C-y,如果重复按下它而不是多次插入上一个命令的第二个参数,它会循环显示前面的命令。

要插入整个上一个命令,您可以键入!!\e^\e^history-expand-line

答案 8 :(得分:0)

!^将为您提供第一个参数,!$将为您提供最后的参数,!: n 将为您提供第n个元素。

答案 9 :(得分:0)

要插入先前的参数:

  • Alt + :插入上一条命令中的最后一个参数(重复以返回历史记录)
  • Alt + + :从最后一个命令插入#nth个最后一个参数(重复以返回历史记录)< / em>
  • Alt + - Alt + zsh: Alt + - + + :从末尾插入第#n个第一个参数命令(重复以返回历史记录)

示例:

最后一个命令是:

mv foo bar
  • Alt + 0 + :插入最后一个命令的第一个参数= mv
  • Alt + 2 + :插入上一个命令的最后一个第二个参数= foo
  • up Ctrl + w :没有最后一个单词的最后一个命令= mv foo

常规快捷方式

  • Ctrl + w :从光标中删除最后一个单词
  • Ctrl + k :删除光标后的所有内容
  • Ctrl + _ :撤消上一次编辑(在超过 Ctrl + w 时非常有用)
  • Ctrl + :将光标移至最后一个单词
  • Ctrl + 向右:将光标移至下一个单词
  • home Ctrl + a :将光标移至命令的开头
  • end Ctrl + e :将光标移至命令末尾
  • Ctrl + u :清除整个命令

要遍历上一个命令中的参数

仅适用于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 + + + + :{{ 1}}
  • Alt + + + + + 2
  • Alt + + + + + + 1

来源:https://stackoverflow.com/a/34861762/3163120

查看所有可用的快捷方式

  • 重击: echo
  • zsh: bind -lp

答案 10 :(得分:0)

如果您使用的是Mac,则倾向于使用ctrl + letter获得扩展字符。我在我的终端(iTerm2)中将我的空格键选项键定义为meta。这意味着我可以使用该键按字导航并从以前的命令中提取参数。