如何从以前的bash命令获得倒数第二个参数? (在交互式bash shell中)

时间:2015-01-21 00:49:37

标签: bash shell command-line command-line-arguments interactive-shell

如何在bash交互式shell中轻松获取上一个命令的倒数第二个(倒数第二个)单词/参数?我经常在后台运行命令,我想获得&之前指定的文件,例如,

  % echo foo > /tmp/foo &
  % cat !$
  % &

在上面的示例中,!$给出了最后一个单词&。但我想要倒数第二个论点/tmp/foo



请注意,可以使用类似!-1:3范围的单词指示符,但这对于具有大量单词的命令来说是不切实际的,因为它不会很快显示有多少单词,例如,< / p>

% (set -x; date; pwd; git status; git diff;  git log | tail -30; date; args=--verbose time make test; date) >& /tmp/log/make.test.20150122-Thu-0834 &
% echo !-1:30
/tmp/log/make.test.20150122-Thu-0834

上面的示例有效,但您必须计算并知道您想要的单词是第30个单词,这非常耗时且容易出错。

有没有一种简单的方法来获得倒数第二个(倒数第二个)字?

(请注意,此问题是指交互式shell中前一个命令的参数,而不是指从命令行传递给shell脚本的参数,因为这里的一些答案和注释是指。)

2 个答案:

答案 0 :(得分:5)

交互式地,您可以使用 esc - 1 esc ,带有默认绑定。

更一般地,序列 esc 从前一个命令行获取最终标记,您可以传递一个数字参数来指定另一个标记(例如, esc 1 esc 获取第一个参数, esc 0 esc 获取命令本身。)

esc 是Meta的键绑定之一;在许多现代键盘上,您也可以使用 Alt 作为Meta(同时按下它,而不是作为前缀修饰符)。我更喜欢 esc 作为meta,因为当我的肌肉记忆学到这些东西时,我们没有(可靠的,一致的)Alt键,它仍然可以移植到VT100和Sun键盘;至少在我当前的键盘上(Mac OSX Yosemite),例如 alt - - 除了指定负数字参数外,还做其他事情。

来自之前的复合命令

value

序列 esc 2 esc 获取分号,因为这是第二个令牌。

我确信有echo moo; echo bar 历史扩张的方法,但我非常希望看到我在做什么。此机制为您提供要引用到当前命令行的文本,以便您可以根据需要进行编辑。

答案 1 :(得分:3)

使用此命令使用历史记录中最后一个命令的第3个参数运行命令:

echo foo > /tmp/foo &
cat !-1:3