Bash:使用包含带转义空格的目录的变量的意外行为

Bash: unexpected behavior using a variable containing directory with escaped spaces

这是 https://apple.stackexchange.com/questions/52459/ 的跟进,是关于 bash 中的意外行为。总结一下 link 中的内容,问题是将终端中的当前目录复制到一个临时变量,比如粘贴板,并使用它在不同的终端 window 中切换目录。那里提供的解决方案几乎以最有效的方式解决了它!但是,当我实际尝试使用这个具有正确转义目录名称的临时变量更改目录时,它似乎无法在 bash.

中正常工作

我的最小工作示例如下:

alias cwd='printf "%q/\n" "$(pwd)"'

现在在终端中:

>$ mkdir tmp
>$ cd tmp
>$ mkdir test\ dir
>$ cd test\ dir
>$ cwd | pbcopy

在新终端中:

>$ echo "$(pbpaste)"
/Users/foo/tmp/test\ dir/
>$ cd $(pbpaste)
-bash: cd: /Users/kaushik/tmp/test\: No such file or directory
>$ cd "$(pbpaste)"
-bash: cd: /Users/kaushik/tmp/test\ dir/: No such file or directory

我在试图找出我做错了什么时感到很茫然。我唯一确定的是,这是一个 bash 问题,而不是 OS X 上突然出现的问题。

感谢您在这方面的帮助,顺便说一下,经过这么多年,我终于不得不写下我的第一个堆栈溢出 post!

从评论中复制:链接的答案特别要求适合粘贴的转义 PWD,但您需要一个编程输入,转义会适得其反。只需 pwd | pbcopycd "$(pbpaste)".

编辑:

(To be honest, I presumed you would need to escape it explicitly since that's how I create a directory with spaces using pwd.)

问题是命令行解析器只进行一次转义。在 cd foo\ bar 的情况下,space 未转义。在 cd $(pbpaste) 的情况下,没有什么可以逃避的;然后 pbpaste 的文字输出被放入参数列表中。