在 shell 中,键入ALT+.
或使用!$
会调用上一个命令的最后传递的参数。我一直使用这个,但是当你分离之前的命令时,你该怎么做呢?
$ do-something foo a_long_file_name &
如何获得a_long_file_name
提示而不是&符号?
答案1
\e-\e.
(或按住 alt/option 的同时按住-
).
插入倒数第二个单词。
同样,\e-2\e.
插入倒数第三个单词,然后\e2\e.
插入第三个单词。
答案2
使用历史扩展,您可以访问上一个命令的单词,其中!:n
n 以命令名称从 0 开始。!^
相当于!:1
.在这种情况下,您想要!:2
$ echo foo bar &
[1] 10750
foo bar
$ echo !:2
echo bar
bar
[1]+ Done echo foo bar
答案3
你做$_
。
echo 'hey there' &
echo "$_"
输出
hey there
hey there
答案4
格伦和劳里的答案是正确的,但在我看来,他们需要太多的打字。最后我想出了以下解决方案:C-j
循环遍历上一个命令的参数(不包括&符号),从最后一个到第一个。这个很实用!以下是如何做到这一点:
编写以下 bash 脚本:
#!/bin/bash
cj_hist=$(builtin history | tail -n1)
cj_num=$(cut -f1 -d\ <<< $cj_hist)
if [[ $cj_old_num -eq $cj_num ]]
then
cj_killw='\x17'
else
cj_args=$(cut -f3- -d\ <<< $cj_hist)
cj_args=${cj_args%&}
cj_args=($cj_args)
cj_cnt=0
cj_killw=''
fi
[[ $cj_cnt -le 0 ]] && cj_cnt=${#cj_args[*]}
let cj_cnt--
if [[ $cj_cnt -eq -1 ]]
then
bind '"\ez":""'
# bind -m vi-insert '"\C-o":""'
else
bind '"\ez":"'$cj_killw${cj_args[$cj_cnt]}'"'
# bind -m vi-insert '"\C-o":"'$cj_killw${cj_args[$cj_cnt]}'"'
fi
cj_old_num=$cj_num
将其放入 ~/.bashrc 中:
bind -x '"\ew": source ~/foo.sh' # ~/foo.sh is the script's path
bind '"\C-j":"\ew\ez"'
# bind -x '"\C-h": source ~/foo.sh' # vi-users: no mess
# bind -m vi-insert '"\C-j":"\C-h\C-o"' # with escapes
注意:由于我们获取脚本,我们必须使用不常用的变量名称,因此前缀cj_
。当然,您可以使用其他前缀。