我知道 Esc + 。为您提供最后一个命令的最后一个参数。
但我对最后一个命令的第一个参数感兴趣。 这样做是否有关键约束力?
在同一行上,是否有从最后一个命令获取第n个参数的通用方法?
我知道在bash脚本中,您可以使用$0
,$1
等,但这些不适用于命令行。
另外,如何迭代前面命令的第0个参数,就像我们可以通过连续按 Esc + 来完成最后一个参数。?
答案 0 :(得分:276)
!$
获取上一个命令行参数的最后一个元素。
答案 1 :(得分:260)
正如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 - - 开始指定负数,然后释放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!
通常在其他相关命令中完成,例如sed
,vi
和regex
(正则表达式) - 一种非常有效的搜索方式(匹配字符串)。
不,你不能在这里做
!: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)
最后一个命令是:
mv foo bar
mv
foo
mv foo
运行或将此添加到您的~/.zshrc
autoload -Uz copy-earlier-word
zle -N copy-earlier-word
bindkey "^[:" copy-earlier-word
现在使用 Alt + 。返回所需位置,然后使用 Alt + :进行遍历参数
假设最后一个命令是
echo 1 2 3 4 5
5
4
3
2
1
来源:https://stackoverflow.com/a/34861762/3163120
echo
bind -lp
答案 10 :(得分:0)
如果您使用的是Mac,则倾向于使用ctrl + letter获得扩展字符。我在我的终端(iTerm2)中将我的空格键选项键定义为meta。这意味着我可以使用该键按字导航并从以前的命令中提取参数。