首页 > 解决方案 > 使用 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 $1

该变量$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"

标签: bashdockershellescaping

解决方案


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 "$1"

或者也许更好

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

也许您仍然需要docker -it恢复输出。

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

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

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


推荐阅读