假設我有一個名爲Foo
的文件夾位於/home/user/
(我的/home/user
也被代表爲~
)。Tilde擴展在Bash中不起作用
我想有一個變量
a="~/Foo"
,然後做
cd $a
我得到 -bash: cd: ~/Foo: No such file or directory
但是,如果我只是做cd ~/Foo
它工作正常。任何關於如何使這個工作的線索?
假設我有一個名爲Foo
的文件夾位於/home/user/
(我的/home/user
也被代表爲~
)。Tilde擴展在Bash中不起作用
我想有一個變量
a="~/Foo"
,然後做
cd $a
我得到 -bash: cd: ~/Foo: No such file or directory
但是,如果我只是做cd ~/Foo
它工作正常。任何關於如何使這個工作的線索?
你可以做(不變量賦值期間引號):
a=~/Foo
cd "$a"
但在這種情況下,變量$a
不會存儲~/Foo
但擴展形式/home/user/Foo
。或者你可以使用eval
:
a="~/Foo"
eval cd "$a"
您可以使用$HOME
代替代字號(代字號由外殼擴展爲$HOME
的內容)。 例子:
dir="$HOME/Foo";
cd "$dir";
如果你的名字不是「John F.」,引用的好處是什麼,爲什麼?分號? – 2011-04-21 18:48:40
謝謝你提到代字號實際上擴展到$ HOME,在我看來,它更可讀。 – DusteD 2017-11-29 08:04:20
如果使用雙引號〜將保持在$一個該字符。
CD $一個不會擴大,因爲〜變量值不被外殼擴展。
解決的辦法是:
EVAL 「CD美元的」
一個更強大的解決方案是使用的東西,像sed,甚至更好,bash的參數擴展:
somedir="~/Foo/test~/ing";
cd ${somedir/#\~/$HOME}
或如果你必須使用sed,
cd $(echo $somedir | sed "s#^~#$HOME#")
不幸的是,如果你試圖引用其他人的主目錄,這將不起作用。'somedir =「〜jack/TMP」; cd $ {somedir /#\〜/ $ HOME}'=> '-bash:cd:/ Users/jackjack/TMP:沒有這樣的文件或目錄「:-( – duthen 2017-08-17 12:48:47
謝謝! eval的cd工作。我的確想保持「〜/ Foo」完好無損,所以這個解決方案很有效。起初,我試圖 CD'EVAL $了' 但沒有工作。 – Benjamin 2011-04-21 18:38:53
反對使用'eval'的通常警告也應在此處標出。 **不要**對未經過消毒的數據或以安全方式自行構建的數據運行'eval'。 – tripleee 2014-11-19 23:27:05
不幸的是,如果目錄名稱包含空格,這將不起作用。 'a =「〜/ dir with spaces」; eval cd「$ a」'=>'-bash:cd:/ Users/jack/dir:沒有這樣的文件或目錄':-( – duthen 2017-08-17 12:45:02