J'essaie d'écraser un fichier avec une sortie de commande, mais uniquement s'il y a une sortie. Autrement dit, je veux habituellement
mycommand > myfile
mais si cela devait écraser myfile
avec des données vides, je souhaite conserver l'ancienne version de myfile
. Je pensais que quelque chose en utilisant ifne
devrait être possible, à la
mycommand | ifne (cat > myfile)
mais ça ne marche pas ...
Une approche indirecte
mycommand | tee mytempfile | ifne mv mytempfile myfile
fonctionne, mais je considère que l'utilisation de ce fichier temporaire n'est pas élégante.
Q: Pourquoi ma première idée ne fonctionne-t-elle pas? Peut-on le faire fonctionner? Ou existe-t-il une autre solution intéressante et peut-être complètement différente pour mon problème d'origine?
Réponses:
Votre première approche fonctionne, il vous suffit de donner une commande à
ifne
(voirman ifne
):Vous devez donc lui donner une commande à exécuter. Vous y êtes presque, ça
tee
marchera:Si votre commande ne produit pas une énorme quantité de données, si elle est suffisamment petite pour tenir dans une variable, vous pouvez également faire:
la source
La solution piéton:
Autrement dit, enregistrez la sortie dans un fichier temporaire, puis testez si elle est vide ou non. S'il n'est pas vide, copiez son contenu sur votre fichier. Finalement, supprimez le fichier temporaire.
J'utilise
cat "$tmpfile" >myfile
plutôt quecp "$tmpfile" myfile
(oumv
) pour obtenir le même effet que vous auriez obtenumycommand >myfile
, c'est-à-dire pour tronquer le fichier existant et préserver la propriété et les autorisations.Si
$TMPDIR
(utilisé parmktemp
) se trouve sur un système de fichiers monté en mémoire, cela n'écrira pas sur le disque autrement que lors de l'écrituremyfile
. Il serait en outre plus portable que l'utilisationifne
.la source