6

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

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

在上面的例子中,!$给出最后一个词,&。但我想要倒数第二个参数,/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

上面的例子可行,但是你要数一数,知道你要的词是第 30 个词,既费时又容易出错。

有没有一种简单的方法可以获得倒数第二个(倒数第二个)单词?

更新:请注意,我正在寻找要在命令行上键入的内容(例如,历史扩展,例如!! 事件指示符$ 单词指示符),而不是使用readline 键绑定(例如,esc键)。

(请注意,这个问题是指交互式 shell 中前一个命令的参数,而不是从命令行传递给 shell 脚本的参数,正如这里的一些答案和评论所指的那样。)

4

2 回答 2

7

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

更一般地说,该序列esc .从前一个命令行获取最后一个标记,您可以将一个数字参数传递给它以指定一个不同的参数(例如,esc 1 esc .获取第一个参数,并esc 0 esc .获取命令本身)。

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

从像这样的先前复合命令

echo moo; echo bar

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

我确信也有一种方法可以!扩展历史,但我更喜欢看看我在做什么。此机制将您想要引用的文本带入当前命令行,因此您也可以根据需要对其进行编辑。

于 2016-08-24T02:08:45.747 回答
3

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

echo foo > /tmp/foo &
cat !-1:3
于 2015-01-22T18:02:20.473 回答