bash - 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
我在这里想念什么?
解决方案
您的第一个“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 的所有行都进行参数扩展,...
推荐阅读
- android - SharedElementTransition 没有使用 Glide 正确地动画图像缩放
- python - 为什么我的服务器没有回显或显示消息?
- c++ - 库是否包含在预处理器或链接中
- google-apps-script - 从 Google 表格将数据矩阵读入脚本函数
- apache-kafka - 擦除所有 Kafka 数据?
- paypal - PayPal Payflow Recurring Billing:重新激活个人资料
- javascript - 当我在“for”循环内的模板字符串中添加元素时,它会在字符串的开头返回单词“undefined”
- winapi - winapi - 如何检测鼠标在上下文菜单上的移动
- java - 选定的 Spinner 值在选择时未更改并继续为空
- database - 我正在尝试使用子表单/弹出表单在 MS Access 的子数据表中填充数据