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

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

但是我对最后一个命令的第一个参数很感兴趣。 有没有一个关键的约束力呢?

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

另外,迭代前一个命令的第0个参数,就像我们通过连续按下Esc +所做的最后一个参数一样

就像M-. (meta-dot或者esc-dot或者alt-dot)是readline函数yank-last-argMCy (meta-control-y或者esc-ctrl-y或者ctrl-alt-y)是readline函数yank-nth-arg 如果没有指定n ,则会跳过上一个命令的第一个参数。

要指定参数,请按Escape和数字,或按住Alt并按数字。 你可以做Alt-开始指定一个负数,然后释放Alt并按数字(这将从参数列表的末尾算起。

例:

input以下命令

 $ echo abcdefg abcdefg 

现在,在下一个提示符处,inputecho (以及下面的空格)

按下AltCtrly ,你会看到:

 $ echo a 

没有按Enter键 ,请执行以下操作

按下Alt3 AltCtrly

按下Alt- 2 AltCtrly

现在你会看到:

 $ echo ace 

顺便说一下,你可以通过select参数0来把echo放在行上:

按下Alt0 AltCtrly

编辑:

要回答你添加到你原来的问题:

您可以按Alt0,然后反复按Alt 逐步完成前面的命令(参数0)。 同样的Alt-然后重复Alt 将允许你通过前面的倒数第二个参数。

如果历史上某一行没有适当的论点,那钟声就会响起。

如果您经常使用某个特定组合,则可以定义一个macros,以便一个按键就可以执行该macros。 这个例子将通过按下AltShiftY来调用前面命令的第二个参数。 你可以select任何可用的按键,而不是这个。 您可以反复按下以前的步骤。

要试一试,在Bash提示符处inputmacros:

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

为了使其持久,请将以下行添加到~/.inputrc文件中:

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

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

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

要使用第一个参数,可以使用!^!:1

例:

 $ echo abcdeabcde $ echo !^ echo a a $ echo abcdeabcde $ 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 

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

我喜欢@larsmans回答这么多,我不得不学习更多。 添加这个答案,以帮助他人find手册页部分,并知道什么谷歌:

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

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

你也可以从历史中的任何命令中获得参数!

 $ echo abcdefg abcdefg $ 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 abcdefg 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?会是第一个参数today? 第六 ,那是最后一个; 这意味着可以通过键入来引用它:

Alt + 6,然后按Ctrl-Alt-6


Ctrl通常表示为前缀为键名称的帽子字符,而Alt表示M-前缀。

所以上面的快捷键可以重新定义为^My可以被抽出。


另外,在命令行中有帽子replace的快捷方式:

 echo Hello, world! ^Hello^Bye Bye, world! 

replace前一个命令的第一个匹配的string ,这意味着:

 Hello, world! Hello, people! ^Hello^Bye 

会导致:

 Bye, world! Hello, people! 

留下第二场比赛( hello )不变。

注意:不要在帽子之间留下空间 ,否则操作不起作用。


以上只是一个捷径:

 !:s/Hello/Bye 

事件级(*)replace前一个命令中的第一个find的(匹配的)string,而用g开关在第一个部分前加上一个字符将全部应用于整个行 g

 echo Hello, world! Hello, people! !:gs/Hello/Bye Bye, world! Bye, people! 

通常是在其他相关的命令,如sedviregex (正则expression式)中完成 – 一种非常规的search方式( 匹配string )。

不,你做不到!:sg/Hello/Bye或者!:s/Hello/Bye/g这里,就是这个语法


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

这就是我自己理解的,通过我从包括手册页,博客和论坛在内的各种来源阅读的东西,自己尝试。

希望它能揭示一些神秘的bash ,Bourne-Again shell(一个在sh shell上玩的游戏,在发明者的姓氏后面叫做Bourne shell),许多发行版包括服务器( 服务器操作系统 ) 。

在接受的答案的末尾描述的方法也适用于我的第零个论点。 我在~/.inputrc有这些行:

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

\e2\e.\e2\e\Cy具有更多的优势,如果它反复按下,它会循环前面的命令,而不是多次插入前一个命令的第二个参数。

要插入前一个命令,可以input!!\e^\e^history-expand-line