使用 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
?
我想将变量 $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
?