如何从上一个 bash 命令中获取倒数第二个参数? (在交互式 bash shell 中)

Posted

技术标签:

【中文标题】如何从上一个 bash 命令中获取倒数第二个参数? (在交互式 bash shell 中)【英文标题】:How to get second-to-last argument from previous bash command? (in an interactive bash shell) 【发布时间】:2015-03-19 10:01:04 【问题描述】:

如何在 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个词,既费时又容易出错。

有没有简单的方法来获取倒数第二个(倒数第二个)单词?

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

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

【问题讨论】:

相关:How can I get a specific argument from a previous command in bash? $_ 为您提供最后一个命令的最后一个参数,但这意味着 fooecho foo 因为它不计算非参数,例如 I/O 重定向或后台. 【参考方案1】:

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

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

【讨论】:

是的,但是当命令很大时它是不切实际的。 (请参阅我对问题的最新编辑并举例说明)【参考方案2】:

交互式地,您可以使用 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 . 得到分号,因为这是第二个标记。

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

【讨论】:

1 也是可选的; Esc- 默认为 -1。 @chepner 真,esc - esc。获得倒数第二个——谢谢,TIL! 我现在已经澄清了我的问题,表明我正在寻找非键绑定解决方案(例如,改为使用历史扩展指示符)。 五年后?通常,我们不鼓励在您收到答案后更改问题。

以上是关于如何从上一个 bash 命令中获取倒数第二个参数? (在交互式 bash shell 中)的主要内容,如果未能解决你的问题,请参考以下文章

倒数第二个值(熊猫,Python)

Mongoose/MongoDB:获取倒数第二个文档

获取列表中的倒数第二个元素

jquery如何定位倒数第二个元素,如一个div里有5个ul,那jquery如何才能锁定到倒数第二个ul

如何查找一行数据中倒数第二个非空单元格的内容呢?

如何用最后一个数字翻转字符串中的第一个数字,然后是倒数第二个和倒数第二个,依此类推?