Estou tentando substituir um arquivo com saída de comando, mas apenas se houver alguma saída. Ou seja, eu normalmente quero
mycommand > myfile
mas se isso sobrescrever myfile
com dados vazios, desejo manter a versão antiga do myfile
. Eu pensei que algo usando ifne
deveria ser possível, a la
mycommand | ifne (cat > myfile)
mas isso não funciona ...
Uma abordagem indireta
mycommand | tee mytempfile | ifne mv mytempfile myfile
funciona, mas considero deselegante o uso desse arquivo temporário.
P: Por que minha primeira ideia não funciona? Isso pode ser feito? Ou existe outra solução agradável e talvez completamente diferente para o meu problema original?
Respostas:
Sua primeira abordagem funciona, você só precisa dar um comando para
ifne
(consulteman ifne
):Então você precisa dar um comando para executar. Você está quase lá,
tee
vai funcionar:Se o seu comando não produzir uma quantidade enorme de dados, se for pequeno o suficiente para caber em uma variável, você também poderá:
fonte
A solução para pedestres:
Ou seja, salve a saída em um arquivo temporário e teste se está vazio ou não. Se não estiver vazio, copie o conteúdo do seu arquivo. No final, exclua o arquivo temporário.
Estou usando, em
cat "$tmpfile" >myfile
vez decp "$tmpfile" myfile
(oumv
), para obter o mesmo efeito que você obteriamycommand >myfile
, ou seja, truncar o arquivo existente e preservar a propriedade e as permissões.Se
$TMPDIR
(usado pormktemp
) estiver em um sistema de arquivos montado na memória, isso não gravará no disco, exceto possivelmente ao gravar nomyfile
. Além disso, seria mais portátil do que usarifne
.fonte