首页 > 解决方案 > Bash 和 Docker:带有读取循环的奇怪的heredoc 行为

问题描述

while read使用循环遍历多个值时,我观察到一种奇怪的行为。怪癖是当我使用heredoc将代码传递到Docker容器时,正在读取的变量总是空的:

$ docker run --rm -i ubuntu:18.04 << EOF
echo -e "123\n456"|while read f; do echo "Value: $f"; done
EOF

Value: 
Value: 

用heredoc变量重写的相同工作按预期工作:

$ docker run --rm -i ubuntu:18.04 <<< 'echo -e "123\n456"|while read f; do echo "Value: $f"; done'
Value: 123
Value: 456

如果我以交互方式运行它:

$ docker run --rm -it ubuntu:18.04 bash
root@0d71388ad90d:/# echo -e "123\n456"|while read f; do echo "Value: $f"; done
Value: 123
Value: 456

我在这里想念什么?

标签: bashdockerheredoc

解决方案


您的第一个“here doc”执行参数扩展,$f变成一个空字符串。为了避免它引用EOF

docker run --rm -i ubuntu:18.04 <<'EOF'
echo -e "123\n456"|while read f; do echo "Value: $f"; done
EOF

正如 bash 手册页中所说:

... 如果 word 没有被引用,则 here-document 的所有行都进行参数扩展,...


推荐阅读