Я пытаюсь перезаписать файл с выводом команды, но только если есть какой-либо вывод. То есть я обычно хочу
mycommand > myfile
но если это заменит myfile
пустые данные, я хочу сохранить старую версию myfile
. Я думал, что что-то с использованием ifne
должно быть возможно, а-ля
mycommand | ifne (cat > myfile)
но это не работает ...
Косвенный подход
mycommand | tee mytempfile | ifne mv mytempfile myfile
работает, но я считаю использование этого временного файла нелегальным.
В: Почему моя первая идея не работает? Можно ли заставить его работать? Или есть другое хорошее и, возможно, совершенно другое решение для моей первоначальной проблемы?
Ответы:
Ваш первый подход работает, вам просто нужно дать команду
ifne
(см.man ifne
):Так что вам нужно дать ему команду на запуск. Ты почти там,
tee
будешь работатьЕсли ваша команда не выдает огромное количество данных, если она достаточно мала, чтобы поместиться в переменную, вы также можете сделать:
источник
Пешеходное решение:
То есть сохраните вывод во временный файл, а затем проверьте, пустой он или нет. Если он не пустой, скопируйте его содержимое в файл. В конце удалите временный файл.
Я использую,
cat "$tmpfile" >myfile
а неcp "$tmpfile" myfile
(илиmv
), чтобы получить тот же эффект, который вы получили быmycommand >myfile
, то есть обрезать существующий файл и сохранить права собственности и разрешения.Если
$TMPDIR
(используетсяmktemp
) находится в файловой системе, смонтированной в памяти, то это не приведет к записи на диск иначе, чем при записиmyfile
. Это было бы дополнительно более портативным, чем использованиеifne
.источник