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

标签 bash docker shell escaping

我想将变量$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/

相关文章:

java - 在 Java 中获取命令行的响应

在 C 程序中更改 Linux shell 中的工作目录

linux - 将代码写入输出文件的更快方法

docker - 在Raspberry pi/dev/spi *上的Dockerfile中执行chmod

docker - 容器xxx在CreateContainer期间遇到错误:Windows系统调用失败:系统找不到指定的文件。 (0x2)

git - git clone停在 “Initializing NSS with certpath”上

linux - 悄悄地在脚本中更改 linux 密码

linux - 我不明白为什么在 bash 中比较字符串时遇到问题

image - 将 .pdf 文件更改为 .png Mac OS 10.3 的 shell 脚本

regex - Bash Regex 接受 [Number],但我只想接受 Number