Bash和Docker:带有读取循环的奇怪的Heredoc行为

时间:2018-08-30 13:54:59

标签: 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

我在这里想念什么?

1 个答案:

答案 0 :(得分:1)

您的第一个“ 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,则对本文的所有行进行参数扩展,...