使用 docker exec 将带有转义字符的参数传递给脚本

pass an argument with escape characters to a script with docker exec

我想将变量 $styled 传递给 docker 容器内的脚本。

docker 命令类似于

docker exec container_name "/bin/bash -c cd /where/the/script/is && ./echo.sh $styled"

echo.sh 看起来像这样

#!/bin/bash
echo -e 

变量 $styled 包含转义字符,所以假设它是:

styled=$'\e[7mSOME_TEXT\e[27m'

在我的本地计算机上,我可以毫无问题地将变量传递给本地 echo.sh,不幸的是,它在使用 dockers exec 时不起作用。

错误消息类似于:

./echo.sh \x1b[7mFF1SOME_TEXT\x1b[27m: no such file or directory": unknown

我很确定它与转义的工作方式、单引号、双引号等有关,但我只是对所有这些层感到困惑。


我也试过:

docker exec container_name "/bin/bash -c 'cd /where/the/script/is && ./echo.sh '$P'"

这导致

stat /bin/bash -c 'cd /where/the/script/is && ./echo.sh '\x1b[7mSOME_TEXT\x1b[27m': no such file or directory"

需要引用 bash -c 的参数。

docker exec container_name /bin/bash -c "cd /where/the/script/is && ./echo.sh '$styled'"

您展示的代码对 cd 没有任何用处;如果您的真实代码关心从哪个目录调用它,则可以重构它,这样它就不会。那么这一下子就简单多了。

docker exec container_name /where/the/script/is/echo.sh "$styled"

您还需要修复 echo.sh 中的引号:

#!/bin/bash
echo -e ""

或者更好

#!/bin/bash
echo -e "$@"

也许您还需要 docker -it 才能恢复输出。

上面第一个片段中的单引号很脆弱,如果 $styled 包含未转义的文字单引号,将会失败。如果你真的需要将复杂的引用字符串传递给 bash -c,也许可以做一些像

docker exec container_name /bin/bash -c 'cd /where/the/script/is && ./echo.sh ""' -- "$styled"

传递文字终端转义码是可疑的,但我想试图修复该反模式是一个失败的原因。也许至少我可以说服你使用 printf 而不是 echo -e?