2014-09-29 48 views
1

我正在尋找一個解決方法來處理持續時間較長的問題。 有特殊參數$ _包含最後一個命令的最後一個參數。 好吧,我問你反之亦然。BASH:最後一條命令的特殊參數,不是參數,執行

例如:如果存在包含稱爲上一個二進制/腳本的參數/變量

/etc/init.d/service stop; /etc/init.d/service start 

..可能是更容易。讓我們把它定義爲$.,我們得到這樣的:

/etc/init.d/service stop; $. start 

你有任何想法如何得到這個? 我發現這個Thread on SO 但我只得到輸出是這樣的: printf "\033]0;%[email protected]%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"

但變量$ BASH_COMMAND運作良好:

# echo $BASH_COMMAND 
echo $BASH_COMMAND 

# echo $BASH_VERSION 
4.1.2(1)-release 

任何幫助是非常感謝! 謝謝 弗洛裏安

+0

選中此項:http:// stackoverflow。com/a/4009451/1096140 – 2014-09-29 14:06:51

+0

對不起,但這並不符合我的需要,因爲歷史擴張會過早地擴大。而!:1符合最後使用的參數而非命令。這裏是我的嘗試: '{} [email protected] /根/ tmp目錄 #ls -l命令 insgesamt 0 {} [email protected] /根/ tmp目錄 #/etc/init.d/httpd stop; !:1 /etc/init.d/httpd stop; -l httpd beenden:[FEHLGESCHLAGEN] -bash:-l:command not found' 編輯:/我該如何獲得\ n這裏? – Fet32 2014-09-29 14:11:42

+0

哦!我沒有注意到你想在同一行中輸入2個命令!正如你所說,這是行不通的。 – 2014-09-29 14:21:12

回答

0

如果主要問題是第一個進程的持續時間,並且您知道下一個進程將是什麼,那麼您可以簡單地針對第一個進程發出一個等待命令,並在第二個進程中執行。

例與背景程序:

./longprocess & 
wait ${!}; ./nextprocess # ${!} simply pulls the PID of the last bg process 

例具有手動輸入PID:

./longprocess 
# determine PID of longprocess 
wait [PID]; ./nextprocess 

或者,如果它總是開始| init腳本的停止,可以使一個自定義腳本像下面。

#/bin/bash 
#wrapperscript.sh 
BASESCRIPT=${1} 
./$BASESCRIPT stop 
./$BASESCRIPT start 

由於命令被包裹在一個shell腳本,默認行爲將是殼等待每個命令上移動到下一個之前完成。因此,執行將如下所示:

./wrapperscript.sh /etc/init.d/service 
1

使用您可以重新執行的最後一個命令:

!! 

然而,這不會跟你想要做什麼幫助,所以你可以嘗試使用「搜索並在最後的命令」快捷方式替換:

^<text to search for>^<text to replace with>^ 

所以你的問題可以用得到解決:

/etc/init.d/service stop; ^stop^start^ 

注意:這將只會取代第一個實例的搜索文本。

此外,請參閱下面的更有經驗的窺視評論,其他示例和有用的來源。

+0

+1請注意'^ stop^start'是'!!:s/stop/start /'的快捷方式。有很多運營商可以申請歷史擴張,其中'!!'只是一個例子。 – chepner 2014-09-29 14:16:17

+0

@chepner - 絕對是。此外,通過該標記,'^ foo^bar ^'將僅替換搜索項的第一個**事件,但它是一個很好且很短的錯誤,快捷鍵=) – Raad 2014-09-29 14:19:29

+0

'!!:0'(或'! :0')爲您提供前一個命令的命令字 - 請參閱http://www.gnu.org/software/bash/manual/bashref.html#Word-Designators – 2014-09-29 14:26:06