我想了解在一个简单的脚本中发生了什么,这似乎会产生随机的结果。
我想做的是:
envsubst '$VAR1 $VAR2' < $FILE | tee $FILE
发生了什么:
$FILE在命令之前有内容,但在命令之后不包含任何内容。如何复制这一问题:
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" ]#!/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输出如下所示:
...
/test/file-11 is empty!
/test/file-180 is empty!
/test/file-183 is empty!
/test/file-295 is empty!发布于 2020-03-05 13:37:41
管道是异步的,您已经引入了一个竞争条件。您无法预测envsubst是在$FILE截断之前还是之后从tee读取数据。
正确的方法是将更改写入临时文件,然后在临时文件成功后将原始文件替换为临时文件。
tmp=$(mktemp)
envsubst < "$FILE" > "$tmp" && mv "$tmp" "$FILE"https://stackoverflow.com/questions/60546292
复制相似问题