如何解决使用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"
解决方法
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
?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。