如何使用前一个命令的参数?
我知道Esc + 。 给你最后一个命令的最后一个参数。
但是我对最后一个命令的第一个参数很感兴趣。 有没有一个关键的约束力呢?
同样的道理,从最后的命令中获得第n个参数是否有一个通用的方法呢? 我知道在bash脚本中,可以使用$0
, $1
等,但这些命令行不起作用。
另外,迭代前一个命令的第0个参数,就像我们通过连续按下Esc +所做的最后一个参数一样。 ?
就像M-.
(meta-dot或者esc-dot或者alt-dot)是readline函数yank-last-arg
, MCy
(meta-control-y或者esc-ctrl-y或者ctrl-alt-y)是readline函数yank-nth-arg
如果没有指定n
,则会跳过上一个命令的第一个参数。
要指定参数,请按Escape和数字,或按住Alt并按数字。 你可以做Alt – -开始指定一个负数,然后释放Alt并按数字(这将从参数列表的末尾算起。
例:
input以下命令
$ echo abcdefg abcdefg
现在,在下一个提示符处,inputecho
(以及下面的空格)
按下Alt – Ctrl – y ,你会看到:
$ echo a
没有按Enter键 ,请执行以下操作
按下Alt – 3 Alt – Ctrl – y
按下Alt – - 2 Alt – Ctrl – y
现在你会看到:
$ echo ace
顺便说一下,你可以通过select参数0来把echo
放在行上:
按下Alt – 0 Alt – Ctrl – y
编辑:
要回答你添加到你原来的问题:
您可以按Alt – 0,然后反复按Alt – 。 逐步完成前面的命令(参数0)。 同样的Alt – -然后重复Alt – 。 将允许你通过前面的倒数第二个参数。
如果历史上某一行没有适当的论点,那钟声就会响起。
如果您经常使用某个特定组合,则可以定义一个macros,以便一个按键就可以执行该macros。 这个例子将通过按下Alt – Shift – Y来调用前面命令的第二个参数。 你可以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!
通常是在其他相关的命令,如sed
, vi
和regex
(正则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
。