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

Rob*_*ark 5 bash shell command-line command-line-arguments interactive-shell

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

  % echo foo > /tmp/foo &
  % cat !$
  % &
Run Code Online (Sandbox Code Playgroud)

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



请注意,可以使用类似范围的单词指示符!-1:3,但这对于具有大量单词的命令来说是不切实际的,其中不太明显有多少单词,例如,

% (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
Run Code Online (Sandbox Code Playgroud)

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

有一个简单的方法来获得倒数第二个(倒数第二个)单词吗?

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

tri*_*eee 5

通过交互方式,您可以esc - 1 esc .使用默认绑定获取上一个命令行的倒数第二个参数.

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

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

来自之前的复合命令

echo moo; echo bar
Run Code Online (Sandbox Code Playgroud)

序列esc 2 esc .得到分号,因为那是第二个标记.

我确信有一种!历史扩张的方式,但我非常希望看到我在做什么.此机制为您提供要引用到当前命令行的文本,因此如果您愿意,也可以编辑它.


Gar*_*y_W 4

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

echo foo > /tmp/foo &
cat !-1:3
Run Code Online (Sandbox Code Playgroud)