我试图用命令输出覆盖文件,但前提是有任何输出。也就是说,我通常想要
mycommand > myfile
但如果这会myfile
被空数据覆盖,我希望保留旧版本的myfile
.我认为使用一些东西ifne
应该是可能的,la
mycommand | ifne (cat > myfile)
但这不起作用......
间接方法
mycommand | tee mytempfile | ifne mv mytempfile myfile
有效,但我认为使用该临时文件不优雅。
问:为什么我的第一个想法行不通?可以让它发挥作用吗?或者对于我原来的问题还有另一个不错的、也许完全不同的解决方案?
答案1
您的第一种方法有效,您只需发出命令ifne
(请参阅man ifne
):
NAME
ifne - Run command if the standard input is not empty
SYNOPSIS
ifne [-n] command
DESCRIPTION
ifne runs the following command if and only if the standard input is
not empty.
所以你需要给它一个运行命令。你就快到了,tee
可以工作了:
command | ifne tee myfile > /dev/null
如果您的命令不会产生大量数据,并且数据足够小以适合变量,您还可以执行以下操作:
var=$(mycommand)
[[ -n $var ]] && printf '%s\n' "$var" > myfile
答案2
行人解决方案:
tmpfile=$(mktemp)
mycommand >"$tmpfile"
if [ -s "$tmpfile" ]; then
cat "$tmpfile" >myfile
fi
rm -f "$tmpfile"
即,将输出保存到临时文件,然后测试它是否为空。如果它不为空,请将其内容复制到您的文件上。最后,删除临时文件。
我使用cat "$tmpfile" >myfile
而不是cp "$tmpfile" myfile
(或mv
) 来获得与使用 相同的效果mycommand >myfile
,即截断现有文件并保留所有权和权限。
如果$TMPDIR
( 由mktemp
) 位于内存安装的文件系统上,则除了可能写入 时,它不会写入磁盘myfile
。它还比使用更便携ifne
。