bash - 使用 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
?
推荐阅读
- assembly - Apple II:Prodos、前缀、0 长度前缀和 MLI 调用
- python - 按熊猫表分组的 Pythonic 方式
- typescript - 离子 iframe url 栏以某种方式可见,隐藏它
- go - Swagger 在每个 db 调用上初始化 db(gorm) 连接
- java - 结果集开始之前 (SQLException)
- r - 有条件地用不同的变量替换变量
- python - 在二维数组中查找第一个最大值 - Python
- javascript - 如何将 ResizeObserver 用于多种行为
- mysql - 使用 Avro 作为使用 MySQL Debezium 连接器的发件箱模式的数据格式
- python - Python函数不传递变量