【问题标题】:Bash: use cd command on a variable including spacesBash:对包含空格的变量使用 cd 命令
【发布时间】:2015-04-23 18:50:53
【问题描述】:

我正在尝试更改脚本中的目录,以便使用相对路径执行一系列操作。该文件夹是一个名为$input_path的变量:

cd $(echo "$input_path")

如果变量中有空格,例如“/home/user/test directory/subfolder”,脚本返回错误:

./test_currently_broken.sh:第 86 行:cd:“/home/user/test:没有这样的 文件或目录

我尝试了各种方法来逃避空格:

# 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'/")#

但没有人修复错误 - 它仍然无法更改目录。 我已确认它尝试更改为肯定的目录存在,并且cding 在此脚本之外工作。

cd这种奇怪的行为有解决办法吗?

【问题讨论】:

  • 不是 cd 行为异常,实际上什么都没有。您没有引用子外壳,因此您所在的外壳扩展了从它返回的内容。所以无论你在 subshel​​l 中做什么都是无关紧要的。

标签: bash shell awk sed cd


【解决方案1】:

你为什么不...

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"

【讨论】:

  • 或者如果您出于某种原因想要使用子shell,请引用子shell "$(echo $input_path)"
  • 既然您指出了这一点,这似乎很明显!非常感谢,解决了我的问题。我还能够通过执行相同的操作来修复稍后在文件名包含空格时发生的错误 - 将变量括在引号中。
  • @TomBennett 很高兴看到它对您有所帮助 :) 是的,这是在“流行”之前可能会令人困惑的事情之一,它们变得很明显!
猜你喜欢
  • 2019-04-05
  • 2021-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-21
  • 2020-06-01
  • 2013-08-02
  • 2017-06-14
相关资源
最近更新 更多