我知道Esc+ .为您提供了最后一条命令的最后一个参数。
但是我对最后一个命令的第一个参数感兴趣。有按键绑定吗?
同样,是否存在从最后一个命令获取第n个参数的通用方法?我知道,在bash脚本,您可以使用$0
,$1
等等,但这些并不在命令行工作。
另外,如何遍历先前命令的第0个参数,就像我们可以通过连续按Esc+来处理最后一个参数一样.?
我知道Esc+ .为您提供了最后一条命令的最后一个参数。
但是我对最后一个命令的第一个参数感兴趣。有按键绑定吗?
同样,是否存在从最后一个命令获取第n个参数的通用方法?我知道,在bash脚本,您可以使用$0
,$1
等等,但这些并不在命令行工作。
另外,如何遍历先前命令的第0个参数,就像我们可以通过连续按Esc+来处理最后一个参数一样.?
Answers:
就像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-y
现在您将看到:
$ echo ace
顺便说一句,您可以echo
通过选择参数0 将放在行上:
新闻Alt- 0 Alt- Ctrl-y
编辑:
要回答您添加到原始文件中的问题:
您可以按Alt- 0然后反复按Alt- .以逐步执行前面的命令(参数0)。类似地Alt- -然后重复Alt- .将允许您逐步浏览先前的倒数第二个参数。
如果历史上的某一行没有适当的论据,那么铃声将响起。
如果您经常使用特定的组合,则可以定义一个宏,以便一次击键即可执行。这个例子会按回想起以前的命令第二个参数Alt- - 。Shift Y您可以选择任何喜欢的可用击键来代替此击键。您可以反复按以逐步浏览以前的内容。
要进行尝试,请在Bash提示符下输入宏:
bind '"\eY": "\e2\e."'
要使其持久,请将此行添加到~/.inputrc
文件中:
"\eY": "\e2\e."
不幸的是,这似乎对arg 0或负参数号无效。
-s
(Bash 4中的新增功能)列出了使用创建的宏-x
。
M-.
:Alt-3
Alt-Ctrl-y
例如,等于hold Alt
和input 3.
。如果您3.
多次键入该Alt
命令而没有释放它,那么将遍历先前命令行的第三个参数。
要使用第一个参数,可以使用!^
或!: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-
有点违反直觉,因为它不包含最后一个参数。
file3
从mv file1 file2 file3 target/
?
我非常喜欢@larsmans的答案,所以我必须学习更多。添加此答案以帮助其他人找到手册页部分,并知道要为Google做什么:
$ 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.
您还可以从历史记录中的任何命令获取参数!
$ 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
在Linux中,您可以重复命令以返回历史记录
最后一个命令是:
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
echo
来源:https : //stackoverflow.com/a/34861762/3163120
bind -lp
bindkey -L
我在本要点中保持最新状态https://gist.github.com/madacol/da38e42d7e45c2949a9f425cc20543e9
Alt .
上岩组在Mac上是打字≥
🤔
bindkey -L
在zsh中运行以查看绑定的所有快捷方式,也许它将有助于查明问题,甚至找到其他有用的命令。以我为例:绑定Alt .
定义为bindkey "^[." insert-last-word
。 Ctrl L
(以清除屏幕)-> bindkey "^L" clear-screen
。 Alt+Ctrl h
-> bindkey "^[^H" backward-kill-word
(与Ctrl w
删除最后一个单词相同)
bindkey "^[^_" copy-prev-word
基本上,它可以用于删除先前的(命令的)参数。
例如,如果发出以下命令:
echo Hello, world how are you today?
然后,Hello,
将第一个参数,和today?
所述第六,也就是最后一个; 表示可以通过键入以下内容进行引用:
Alt+6 其次是 Ctrl-Alt-6
Ctrl传统上将表示为^
键名之前的帽子字符,Alt因为M-
它是M eta前缀。
因此,可以将上述快捷方式重新定义为^My
猛拉。
另外,在命令行中有帽子替换快捷方式:
echo Hello, world!
^Hello^Bye
Bye, world!
替换上一个命令的第一个匹配字符串,表示:
Hello, world! Hello, people!
^Hello^Bye
会导致:
Bye, world! Hello, people!
保持第二个匹配(hello
)不变。
注意:请勿在帽子之间留出空间,否则操作将无效。
以上只是以下方面的捷径:
!:s/Hello/Bye
使用event-level(*)替换上一条命令中找到的第一个(匹配)字符串,同时在第一部分加上g
开关前缀将适用于整行 g lob:
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 shell(一种在sh
shell上玩的游戏,在其发明人的姓氏后称其为Bourne shell)的神秘方式提供一些启发,这是许多发行版(包括服务器)(服务器OS)中的默认shell 。
!^将为您提供第一个参数,!$将为您提供最后的参数,!:n将为您提供第n个元素。
bind -lp
并查看当前的绑定。