2013-03-11 57 views
1

我想每執行一次cd執行一些代碼。如果cd是最後一個命令,但我認爲我在正確的軌道上,我正在試驗實際測試。以下是我已經添加到我的.bash_profile檢查上一個命令

update_prompt() 
{ 
    if [ 'cd' = $1 ]; then 
    #DO STUFF 
    fi 
} 

PROMPT_COMMAND="update_prompt "$(!:0)"; $PROMPT_COMMAND" 

這是接近,但它試圖在實際執行命令$ 1,而不是把它作爲一個字符串。有任何想法嗎?

+0

也許[這個答案](http://superuser.com/a/175802)至超級用戶的類似問題可能會有所幫助。 – 2013-03-11 16:10:36

回答

0

我會寫一個包裝cd,而不是使用PROMPT_COMMAND檢查最後執行的命令外殼功能:

cd() { 
    builtin cd "[email protected]" 
    # CUSTOM CODE HERE 
} 
+0

真棒,不知道那個'builtin'命令非常好! – schwiz 2013-03-11 16:18:35

3

編輯:這是我想出的解決方案。它不是基於直接的問題,而是在評論@ schwiz的解釋:

update_prompt() 
{ 
     LAST=$(history | tail -n 1 | cut -d \ -f 5) 
     if [ "cd" = "$LAST" ]; then 
      # DO STUFF 
     fi 
} 

PROMPT_COMMAND="update_prompt" 

回答原來的問題:比較字符串變量的時候把它放在括號來避免解釋:

update_prompt() 
{ 
    if [ 'cd' = "$1" ]; then 
    # ... 
    fi 
} 

可選地,您可以考慮定義一個別名爲cd

alias cd='echo executed && cd' 
+0

或者使用'[[cd = $ 1]]'代替。 – chepner 2013-03-11 15:21:04

+0

我不認爲這會奏效,需要在cd之前執行而不是之前。所以它在我cd目錄中執行。 – schwiz 2013-03-11 15:31:45

+0

我明白。無論如何,只要把括號,它應該工作。 – kamituel 2013-03-11 15:33:39

1

這裏的寫作!:0的更詳細的方式,似乎與PROMPT_COMMAND發揮得更好:

PROMPT_COMMAND='update_prompt $(history -p !:0); $PROMPT_COMMAND'. 

單引號防止命令替換的發生,直到PROMPT_COMMAND實際上是調用。從技術上講,沒有發生歷史擴張;您正在使用history命令將!:0字符串作爲參數進行處理,但它與預期的歷史擴展具有相同的效果。

+0

這只是將我的論點看作字符串「!:0」 – schwiz 2013-03-11 15:29:59

+0

上述更新似乎仍然不太正確。我可能會永久刪除。 – chepner 2013-03-11 15:53:57

+0

問題是'!:0'是剛剛執行的命令之前的命令。好像歷史列表直到'PROMPT_COMMAND'被執行之後纔會更新。 – chepner 2013-03-11 16:06:45