我想将变量$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
?
关于bash - 使用docker exec将带有转义字符的参数传递给脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64445985/