2013-10-07 44 views
1

我有一個shell腳本,它使用alias wd=". /path/to/wd"通過zsh中的別名運行。該腳本執行ruby程序和cd s到它的輸出。它可以工作,但在cd命令之後,該目錄顯示爲「〜result」而不是其實際名稱。來自zsh的cd顯示錯誤的cwd名稱(〜變量)

shell腳本的簡化版本如下

#!/bin/sh 

result=$(ruby engine.rb $*) 
cd $result 

它顯然與使用變量的CD,「結果」這樣做,因爲這是它得到的名稱。

如果更改爲另一個目錄並返回錯誤的名稱仍被使用。

試過這是bash它工作正常,所以這是一個zsh問題。

+0

目錄「show」在哪裏? –

+0

你是什麼意思? – altschuler

+2

不,我在問*你*你*的意思。 –

回答

1

這似乎是使用靜態命名目錄的情況。因爲result的值是一個路徑(推測是)以/開頭,所以zsh將該變量用作路徑的「名稱」,並在顯示提示中的完整路徑時將其縮寫爲縮寫。有關詳細信息,請參見「靜態指定目錄」下的man zshexpn

+0

該手冊頁是巨大的!你知道我應該接受的結論還是有解決方法的機會? – altschuler

+0

您可以使用'hash -d result'從指定的目錄哈希表中移除'result'。 – chepner

+1

太棒了!解決方法是用'unhash -d結果' – altschuler

1

這是由AUTO_NAME_DIRS選項(默認情況下未啓用)引起的:

  AUTO_NAME_DIRS 

     Any parameter that is set to the absolute name of a directory 
     immediately becomes a name for that directory, that will be used 
     by the `%~' and related prompt sequences, and will be available 
     when completion is performed on a word starting with `~'. 
     (Otherwise, the parameter must be used in the form `~param' first.) 

換句話說,啓用AUTO_NAME_DIRS只要你這樣做 project=/path/to/my/project~project成爲/path/to/my/project的縮寫。 這可讓您執行cd ~projectls -lh ~project作爲該目錄的快捷方式。

如果你只是不喜歡在你的提示被顯示爲~project的目錄,你可以 在您的及時更換%~%d始終顯示的完整路徑。

如果您完全不想要這種行爲,請在您的配置中執行unsetopt AUTO_NAME_DIRS

如果您希望保留該選項,但在腳本中禁用該選項,那麼它不會使result爲名稱dir,而是在腳本的頂部執行emulate -LR zsh。這會在腳本運行時將所有選項暫時重置爲其默認值。最好的做法是始終在腳本中使用emulate -LR zsh以防止發生這種奇怪的事情。事實上,這比做unhash -d result來修復它更好。

+0

完美刪除,我使用'%d'作爲提示。 'unsetopt AUTO_NAME_DIRS'沒有真正的工作。 – altschuler