2015-04-23 69 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