2015-04-23 102 views
0

我正在嘗試更改腳本中的目錄以便使用相對路徑執行一堆操作。該文件夾是一個變量命名$input_pathBash:在包含空格的變量上使用cd命令

cd $(echo "$input_path") 

如果在變量的空間,例如 「/ home/user中/ test目錄/子文件夾」,該腳本返回一個錯誤:

./test_currently_broken.sh: line 86: cd: "/home/user/test: No such file or directory

我已經想盡各種辦法逃避的空間:

# escape spaces using backslashes, using sed 
input_path=$(echo "$input_path" | sed 's/ /\\ /g') 

# wrap input path with awk to add quotes 
input_path=$(echo "$input_path" | awk '{print "\"" $0 "\""}') 

# wrap in single quotes using sed 
input_path=$(echo "$input_path" | sed -e "s/\(.*\)/'\1'/")# 

但沒有修復這個錯誤 - 它仍然不能改變目錄。 我已經確認它試圖更改爲的目錄肯定存在,並且cd ing在此腳本之外有效。

有沒有解決這個奇怪的行爲cd

+0

這不是CD是行爲奇怪的是,事實上並沒有什麼。您沒有引用subshel​​l,因此您所在的shell擴展了它所返回的內容。所以無論你在子shell中做什麼都是無關緊要的。 – 2015-04-23 10:32:30

回答

4

爲什麼你不只是...

cd "$input_path" 

,因爲它是引用,也不會有用空格任何問題。

通過說cd $(echo "$input_path")你實際上是說cd my path,而你想要做cd "my path"。因此,正如下面的JID所評論的那樣,您也可以說cd "$(echo $input_path)",因爲重要的引號是「更接近」cd的引號。


如果你不報,cd認爲:

cd my path 

所以它試圖cd my,而如果你引用它認爲:

cd "my path" 
+2

或者如果你由於某種原因想要使用子shell,請引用subshel​​l'「$(echo $ input_path)」' – 2015-04-23 10:30:52

+1

現在你指出它似乎相當明顯!非常感謝,這解決了我的問題。我也能夠通過做同樣的事情來修復文件名有空格後發生的錯誤 - 將變量包裹在引號中。 –

+0

@TomBennett很高興看到它對你有幫助:)是的,這是其中一個可能會令人困惑,直到「流行」的東西之一,它們變得明顯! – fedorqui