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

我知道Esc + 给出了最后一个命令的最后一个参数。

但是我对最后一个命令的第一个参数感兴趣。 是否有一个键绑定来这样做?< / p >

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

同样,遍历前面命令的第0个参数如何,就像我们可以通过连续按Esc + .来处理最后一个参数一样?

104394 次浏览

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

正如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- __abc1来开始指定一个负数,然后释放Alt并按下数字(这将从参数列表的末尾开始计数。

例子:

输入以下命令

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

现在在下一个提示符中,键入echo(后面有空格),然后

Alt-Ctrl-y,你现在会看到:

$ echo a

在没有按输入的情况下,执行以下操作

Alt-3. Alt-Ctrl-y

Alt-- 2 Alt-Ctrl-y

现在你会看到:

$ echo ace

顺便说一下,你可以通过选择参数0来将echo放在行中:

Alt-0 Alt-Ctrl-y

编辑:

要回答你在原文中添加的问题:

你可以按Alt-0,然后重复按Alt-来遍历前面的命令(参数0)。类似地,Alt--,然后重复Alt-将允许你遍历前面的倒数第二个参数。

如果对历史上的某一行没有适当的论证,就会敲响警钟。

如果有一个您经常使用的特定组合,您可以定义一个宏,这样一次击键就可以执行它。这个例子将通过按Alt-转变-Y从前面的命令中召回第二个参数。您可以选择任何可用的击键,而不是这个。您可以重复按下该键来执行先前的操作。

要尝试一下,在Bash提示符下输入宏:

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

为了使它持久,将这一行添加到你的~/.inputrc文件中:

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

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

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

我非常喜欢@larsmans的回答,我必须学习更多。添加这个 回答帮助其他人找到手册页部分,并知道要做什么 谷歌:< / p >
$ 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.

要使用第一个参数,可以使用!^!: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-形式有点违反直觉,因为它不包括最后一个参数。

在接受的答案后面描述的方法对我来说也适用于第0个参数。我在~/.inputrc中有这些行:

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

\e2\e\C-y相比,\e2\e.的优势在于,如果重复按下它,它将遍历之前的命令,而不是多次插入前一个命令的第二个参数。

要插入前面的整个命令,可以键入!!\e^\e^history-expand-line

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

$ 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

基本上,它在调用以前的(命令的)参数时有一个用途。

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

echo Hello, world how are you today?

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

Alt + 6后面跟着Ctrl-Alt-6


Ctrl通常表示为前缀为键名的帽子字符^,而Alt则表示为前缀为< em >米eta的M-

所以上面的快捷方式可以被重新定义为^My来yank。


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

echo Hello, world!


^Hello^Bye


Bye, world!

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

Hello, world! Hello, people!


^Hello^Bye

会导致:

Bye, world! Hello, people!

留下第二个匹配(hello)不变。

注意:不要留下帽子之间的距离,否则操作将无法工作。


以上只是一个快捷方式:

!:s/Hello/Bye

事件级别(*)替换前面命令中第一个找到(匹配)的字符串,同时在第一部分加上g开关前缀,将应用于整条线 < em > globally:

echo Hello, world! Hello, people!


!:gs/Hello/Bye


Bye, world! Bye, people!

就像通常在其他相关命令中做的那样,比如sedvi,以及在regex(正则表达式)中——一种标准的搜索方式(匹配字符串)。

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


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

这是我通过自己使用和自己尝试从各种来源(包括手册页、博客和论坛)中了解到的。

希望它能揭示一些关于bash的神秘方式,Bourne- again shell(在sh shell上玩,它本身被称为Bourne shell,以其发明者的姓氏命名),它是许多发行版中的默认shell,包括服务器(服务器操作系统的)。

^将得到第一个参数,!$将得到最后一个参数,!:n将得到第n个元素。

在Ubuntu 18.04上测试


插入先前的参数:

  • Alt+:插入最后一个命令的最后一个参数。
  • Alt++:从上一个命令中插入#n个最后一个参数。
  • Alt+-Alt+zsh: Alt+-++:从上一个命令插入第n个第一个参数。

在Linux中,您可以重复命令以返回历史

例子:

最后一个命令是:

mv foo bar
  • Alt+0+:插入最后一个命令的第一个参数= mv
  • Alt+2+:插入最后一个命令的最后第二个参数= foo
  • 向上Ctrl+w:最后一个不带最后一个字的命令= mv foo

通用快捷键

  • Ctrl+w:从游标中移除最后一个单词
  • Alt+d:从光标中移除下一个单词
  • Ctrl+k:剪切光标后的所有内容
  • Ctrl+uzsh: Alt+w:剪切光标之前的所有内容
  • zsh: Ctrl+u:剪切整个命令(在bash中,您可以组合Ctrl+uCtrl+k)
  • Ctrl+y:粘贴之前用Ctrl+uCtrl+k切割的字符
  • Ctrl+_:撤销上次编辑(当超过Ctrl+w时非常有用)
  • Ctrl+:移到最后一个单词
  • Ctrl+正确的:移动到下一个单词
  • 首页Ctrl+一个:移动到行首
  • 结束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://github.com/madacol/knowledge/blob/master/bash-zsh_TerminalShorcuts.md

如果你使用的是mac,你会倾向于使用ctrl+字母来扩展字符。我在终端(iTerm2)中设置了空格右键选项键,并将其定义为meta。这意味着我使用键按字导航,并从以前的命令中提取参数。

要粘贴第一个参数,请按住Alt键,当它向下时,按下'1'键和'。的关键。

要粘贴第n个参数,将上面的'1'键替换为相应的数字键。

如果这不起作用,您的终端模拟器可能在它到达shell之前捕获Alt键。一些终端(xfce4-terminal)允许关闭&;Alt-"配置文件中的快捷方式。

这要归功于Jonas Eberle,我从他的评论中找到了另一个答案。