Ich versuche, eine Datei mit Befehlsausgabe zu überschreiben, aber nur, wenn eine Ausgabe vorhanden ist. Das heißt, ich möchte normalerweise
mycommand > myfile
aber wenn dies myfile
mit leeren Daten überschrieben würde , möchte ich die alte Version von beibehalten myfile
. Ich dachte, dass etwas mit ifne
möglich sein sollte, a la
mycommand | ifne (cat > myfile)
aber das geht nicht ...
Ein indirekter Ansatz
mycommand | tee mytempfile | ifne mv mytempfile myfile
funktioniert, aber ich halte die Verwendung dieser temporären Datei für nicht relevant.
F: Warum funktioniert meine erste Idee nicht? Kann es funktionieren? Oder gibt es eine andere nette und vielleicht ganz andere Lösung für mein ursprüngliches Problem?
Antworten:
Ihr erster Ansatz funktioniert, Sie müssen nur einen Befehl geben
ifne
(sieheman ifne
):Sie müssen ihm also einen Befehl zum Ausführen geben. Du bist fast da,
tee
wird funktionieren:Wenn Ihr Befehl keine enorme Datenmenge erzeugt und klein genug ist, um in eine Variable zu passen, können Sie auch Folgendes tun:
quelle
Die Fußgängerlösung:
Speichern Sie die Ausgabe in einer temporären Datei und testen Sie dann, ob sie leer ist oder nicht. Wenn es nicht leer ist, kopieren Sie den Inhalt über Ihre Datei. Löschen Sie am Ende die temporäre Datei.
Ich verwende
cat "$tmpfile" >myfile
eher alscp "$tmpfile" myfile
(odermv
), um den gleichen Effekt zu erzielen, den Sie erhalten hättenmycommand >myfile
, dh um die vorhandene Datei abzuschneiden und das Eigentum und die Berechtigungen beizubehalten.Wenn sich
$TMPDIR
(verwendet vonmktemp
) auf einem speichermontierten Dateisystem befindet, wird dies nur beim Schreiben auf die Festplatte geschriebenmyfile
. Es wäre außerdem tragbarer als die Verwendungifne
.quelle