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

相關問題