Shell:如何在分离时获取上一个命令的最后一个参数?

Shell:如何在分离时获取上一个命令的最后一个参数?

在 shell 中,键入ALT+.或使用!$会调用上一个命令的最后传递的参数。我一直使用这个,但是当你分离之前的命令时,你该怎么做呢?

$ do-something foo a_long_file_name &

如何获得a_long_file_name提示而不是&符号?

答案1

\e-\e.(或按住 alt/option 的同时按住-.插入倒数第二个单词。

同样,\e-2\e.插入倒数第三个单词,然后\e2\e.插入第三个单词。

答案2

使用历史扩展,您可以访问上一个命令的单词,其中!:nn 以命令名称从 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_。当然,您可以使用其他前缀。

相关内容