首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将envsubst与tee随机结合使用将生成一个空文件。

将envsubst与tee随机结合使用将生成一个空文件。
EN

Stack Overflow用户
提问于 2020-03-05 13:17:45
回答 1查看 805关注 0票数 0

我想了解在一个简单的脚本中发生了什么,这似乎会产生随机的结果。

我想做的是:

  • 从环境中定义的值替换已存在的文件中的变量.

  • 这是在一个带有bash脚本的Docker容器中完成的,该脚本运行以下命令:

envsubst '$VAR1 $VAR2' < $FILE | tee $FILE

发生了什么:

  • 有时有问题的$FILE在命令之前有内容,但在命令之后不包含任何内容。

如何复制这一问题:

  • Dockerfile:

代码语言:javascript
复制
FROM debian:stretch

RUN apt-get update -qy
RUN apt-get install -qy gettext

COPY main-script /main-script
RUN chmod +x /main-script

ENTRYPOINT [ "/main-script" ]

  • Bash脚本:

代码语言:javascript
复制
#!/bin/bash

mkdir -p /test

export TEST1=1
export TEST2=2
export TEST3=3

for I in {1..300} ; do
    echo '$TEST1 $TEST2 $TEST3' > /test/file-$I
done

for FILE in /test/file-* ; do
    envsubst < $FILE | tee $FILE
done

for FILE in /test/file-* ; do
    if [[ -z "$(cat $FILE)" ]]; then
        echo "$FILE is empty!"
        FAIL=1
    fi
done

if [[ -n "$FAIL" ]]; then
    exit 2
fi

输出如下所示:

代码语言:javascript
复制
...
/test/file-11 is empty!
/test/file-180 is empty!
/test/file-183 is empty!
/test/file-295 is empty!
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-05 13:37:41

管道是异步的,您已经引入了一个竞争条件。您无法预测envsubst是在$FILE截断之前还是之后从tee读取数据。

正确的方法是将更改写入临时文件,然后在临时文件成功后将原始文件替换为临时文件。

代码语言:javascript
复制
tmp=$(mktemp)
envsubst < "$FILE" > "$tmp" &&  mv "$tmp" "$FILE"
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60546292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档