2011-04-21 129 views
10

假設我有一個名爲Foo的文件夾位於/home/user/(我的/home/user也被代表爲~)。Tilde擴展在Bash中不起作用

我想有一個變量

a="~/Foo",然後做

cd $a

我得到 -bash: cd: ~/Foo: No such file or directory

但是,如果我只是做cd ~/Foo它工作正常。任何關於如何使這個工作的線索?

回答

20

你可以做(​​不變量賦值期間引號):

a=~/Foo 
cd "$a" 

但在這種情況下,變量$a不會存儲~/Foo但擴展形式/home/user/Foo。或者你可以使用eval

a="~/Foo" 
eval cd "$a" 
+0

謝謝! eval的cd工作。我的確想保持「〜/ Foo」完好無損,所以這個解決方案很有效。起初,我試圖 CD'EVAL $了' 但沒有工作。 – Benjamin 2011-04-21 18:38:53

+1

反對使用'eval'的通常警告也應在此處標出。 **不要**對未經過消毒的數據或以安全方式自行構建的數據運行'eval'。 – tripleee 2014-11-19 23:27:05

+0

不幸的是,如果目錄名稱包含空格,這將不起作用。 'a =「〜/ dir with spaces」; eval cd「$ a」'=>'-bash:cd:/ Users/jack/dir:沒有這樣的文件或目錄':-( – duthen 2017-08-17 12:45:02

5

您可以使用$HOME代替代字號(代字號由外殼擴展爲$HOME的內容)。 例子:

dir="$HOME/Foo"; 
cd "$dir"; 
+1

如果你的名字不是「John F.」,引用的好處是什麼,爲什麼?分號? – 2011-04-21 18:48:40

+0

謝謝你提到代字號實際上擴展到$ HOME,在我看來,它更可讀。 – DusteD 2017-11-29 08:04:20

0

如果使用雙引號〜將保持在$一個該字符。

CD $一個不會擴大,因爲〜變量值不被外殼擴展。

解決的辦法是:

EVAL 「CD美元的」

0

一個更強大的解決方案是使用的東西,像sed,甚至更好,bash的參數擴展:

somedir="~/Foo/test~/ing"; 
cd ${somedir/#\~/$HOME} 

或如果你必須使用sed,

cd $(echo $somedir | sed "s#^~#$HOME#") 
+0

不幸的是,如果你試圖引用其他人的主目錄,這將不起作用。'somedir =「〜jack/TMP」; cd $ {somedir /#\〜/ $ HOME}'=> '-bash:cd:/ Users/jackjack/TMP:沒有這樣的文件或目錄「:-( – duthen 2017-08-17 12:48:47