Bash参数扩展不带引号的转义值

Bash参数扩展不带引号的转义值,bash,docker,Bash,Docker,我需要使用-v参数在主机和Docker容器之间共享数据: $ docker -v host_dir:container_dir image_name 在这种情况下,我需要共享当前的工作目录。通常可以这样做 $ docker -v `pwd`:container_dir image_name 但如果当前工作目录包含任何空格(或其他应转义的字符),则该操作将失败。有一种特殊的方法可以扩展参数值,以便安全地重新用于输入: $ docker -v ${PWD@Q}:container_dir ima

我需要使用
-v
参数在主机和Docker容器之间共享数据:

$ docker -v host_dir:container_dir image_name
在这种情况下,我需要共享当前的工作目录。通常可以这样做

$ docker -v `pwd`:container_dir image_name
但如果当前工作目录包含任何空格(或其他应转义的字符),则该操作将失败。有一种特殊的方法可以扩展参数值,以便安全地重新用于输入:

$ docker -v ${PWD@Q}:container_dir image_name
但这也没有帮助,因为路径用单引号括起来,这会导致非法参数值:
-v'/present/working/dir with spaces':container\u dir
。正确的语法应该是
-v/present/working/dir\with\spaces:container\u dir


因此,我的问题是,如何展开参数值,用反斜杠转义特殊字符,而不是将值括在引号中?

您希望在shell命令行中用引号括起变量:

$ docker -v "`pwd`:container_dir" image_name
or
$ docker -v "$PWD:container_dir" image_name
否则,bash将在命令替换或参数替换发生后执行单词拆分


这里发生的事情并不是用反斜杠转义:这只是让bash认识到您不希望在那里发生分词,这使得它作为单个参数传递给您的程序(在本例中为docker)。

您希望在shell命令行中使用引号内的变量:

$ docker -v "`pwd`:container_dir" image_name
or
$ docker -v "$PWD:container_dir" image_name
否则,bash将在命令替换或参数替换发生后执行单词拆分


这里发生的事情不是用反斜杠转义:这只是让bash认识到您不希望在那里发生分词,这使得它作为一个参数传递给您的程序(在本例中为docker)。

docker-v“$(pwd)”:container_dir…
应该足够了。
docker-v“$(pwd)”:container_dir…
应该足够了。后者不应该有@Q,因为这会添加一层转义,这是正确的,谢谢!粘贴行后我忘了删除它。后者不应该有@Q,因为这会添加一层转义,这是正确的,谢谢!贴完线后我忘了把它取下来。