2011-03-20 43 views
3

我試着寫一擊未發現句柄執行以下操作當前工作目錄:如何更改內部command_not_found_handle

  1. 如果$ 1成立,這是一個目錄,cd進去。
  2. 如果$ 1存在於用戶定義的目錄$DEV_DIR中,請將其放入CD中。
  3. 如果以前的條件不適用,則失敗。

現在,我有這樣的事情:

export DEV_DIR=/Users/federico/programacion/ 

function command_not_found_handle() { 
    if [ -d $1 ]; then   # the dir exists in '.' 
     cd $1 
    else 
     to=$DEV_DIR$1 
     if [ -d $to ]; then 
      cd $to 
      echo `pwd` 
     else 
      echo "${1}: command not found" 
     fi 
    fi 
} 

雖然它似乎是工作(在echo pwd命令打印預期的目錄),在實際殼的目錄並沒有改變。

我的印象是,由於這是我的.bashrc內的函數,shell不會分叉,我可以執行cd,但顯然這不起作用。任何提示如何解決這個將不勝感激。

+0

爲什麼你需要這樣做?最有可能有更好的方法來完成你想要的任何事情。 – 2011-03-20 21:31:48

+2

我想在一個簡單的方法讓所有項目保存的目錄下的子目錄之間移動。在做'cd〜/ prog; cd某事'一段時間後有點累。我很想聽聽任何其他建議。 – 2011-03-21 21:21:06

回答

2

認爲發生了什麼事情是,外殼fork()■在設置任何重定向後,但在尋找命令之前,所以command_not_found_handle可以在不影響交互shell進程。

+1

+1比較:'f(){echo「$$ $ BASHPID」; }; F; command_not_found_handle(){echo「$$ $ BASHPID」; }; foob​​le「(假設你沒有任何叫做」fooble「的東西)。一個新的外殼是分叉的。(另外,請注意,如果您在函數中包含那些用於其他比較的函數,那麼'$ SHLVL'和'$ BASH_SUBSHELL'不會改變。) – 2011-03-20 21:29:26

0

如果您將此程序作爲主外殼中的腳本運行,它將不會改變,因爲它在執行時會創建子外殼。如果您在當前shell中輸入腳本,那麼它將會產生所需的效果。

~/wbailey> source command_not_found.sh 

這麼說,我覺得有以下將獲得相同的結果:

[email protected]:~/code_katas> cd xxx 2> /dev/null || cd ..; pwd 
/Users/wesbailey 

只需更換「..」與你的環境變量定義的目錄,並建立在你的.bashrc文件的別名。

+0

這不是它不工作的原因。該函數是在當前shell中定義的,但Bash派生一個新的shell來執行該函數(通常情況下不是這樣)。 – 2011-03-20 21:30:42

+0

定義別名的想法正是我不想做的。我的'$ DEV_DIR'裏有82個目錄,所以我不想爲每個目錄創建一個新的別名。 – 2011-03-21 21:17:10

+0

@FedericoBuiles,他正在討論用別名替代cd,該別名也試圖cd到您的項目目錄,而不是每個項目的單獨別名。你可能想用一個shell函數替換cd,而不是別名,所以你可以[-d「$ mydir/$ 1」]在嘗試內置cd之前。而且,pwd不會將目錄作爲參數,所以IDK正是Wes所要做的。 – 2013-11-26 02:28:14

1

你似乎有什麼想使用autocd功能做可以部分可能:

shopt -s autocd 

man bash

autocd - 如果設置,一個命令名稱是一個目錄的名稱執行 就好像它是cd com- mand的參數一樣。該選項僅供交互式shell使用。

否則,只需創建一個函數,您可以通過執行您正在嘗試使用的操作的名稱調用command_not_found_handle

+0

這適用於'.'中的目錄,但我想要完成的最重要的事情是能夠快速移動到其他位置的目錄。不過,我會記住的,謝謝。 – 2011-03-21 21:16:04

+1

@FedericoBuiles:我在最後一句中提出的建議如何? – 2011-03-21 23:45:11

+0

這就需要我每次輸入函數的名字(這與設置'autocd'實際上是一樣的)。儘管如此,我很欣賞你的努力。 – 2011-03-24 17:17:12