如何从上一个 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?$_
为您提供最后一个命令的最后一个参数,但这意味着 foo
的 echo 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 中)的主要内容,如果未能解决你的问题,请参考以下文章