5

如何从bash交互式shell中的上一个命令轻松获取倒数第二个字/参数?我经常在后台运行的命令,我想获得那是&之前指定的文件,例如,如何获得前一个bash命令的倒数第二个参数? (在交互式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字,这是耗时且容易出错。

是否有简单的方法来获取倒数第二个字? (请注意,这个问题是指在交互式shell中的前一个命令的参数,而不是从命令行传递给shell脚本的参数,因为这里指的是一些答案和注释。)

+1

相关:[如何从bash中的上一个命令获取特定参数?](http://superuser.com/q/210846/71161) – kojiro 2015-01-21 00:58:11

+0

'$ _'为您提供最后一个命令的最后一个参数,但这意味着'echo foo'的'foo',因为它不会计算非参数,如I/O重定向或背景。 – 2015-01-22 00:59:34

+0

[处理除第一个参数以外的所有参数]可能的重复(http://stackoverflow.com/questions/9057387/process-all-arguments-except-the-first-one) – 2016-08-23 18:43:18

回答

2

使用这在历史上使用的最后一个命令的第三个参数运行命令:

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

是的,但是当命令很大时它是不切实际的。 (请参阅我对此问题的最新编辑以及此示例) – 2015-01-22 22:17:18

4

交互,就可以得到第二个以前的命令行的最后一个参数与ESC-esc。带有默认绑定的

更一般地,序列esc会从前面的命令行的最后令牌,并且可以通过它的数值参数来指定一个不同的(例如,ESCESC得到的第一个参数,和ESCesc获取命令本身)。

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

从先前的复合命令这样

echo moo; echo bar 

序列ESCESC获取分号,因为这是第二个标记。

我敢肯定有与!历史扩展的方式为好,但我远远更愿意看到我在做什么。这种机制将您想要引用的文本带入您当前的命令行,因此如果您愿意,也可以编辑它。

+0

'1'也是可选的; 'Esc-'默认为-1。 – chepner 2016-08-24 02:29:10

+0

@chepner True,esc - esc。获得第二个到最后一个 - 谢谢,TIL! – tripleee 2016-08-24 02:31:40

相关问题