La philosophie UNIX dit: faites une chose et faites-le bien. Créez des programmes qui gèrent du texte, car c'est une interface universelle.
La sort
commande, au moins GNU sort, a une -o
option permettant d’afficher dans un fichier au lieu de stdout
. Pourquoi, par exemple, est sort foobar -o whatever
utile quand je peux juste sort foobar > whatever
?
sort
unix-philosophy
combattant
la source
la source
Réponses:
Ce n'est pas seulement le genre GNU qui l'a. Le genre BSD l'a aussi. Et quant à pourquoi?
(Je pensais que c'était une bonne question aussi ...)
A partir de la page de manuel: "L'argument donné est le nom d'un fichier de sortie à utiliser à la place de la sortie standard. Ce fichier peut être identique à l'un des fichiers d'entrée."
Vous ne pouvez pas accéder au même fichier avec la redirection, la redirection de sortie efface le fichier.
Pour clarifier davantage, si je voulais trier un fichier et mettre les résultats triés au même endroit que je pourrais penser à essayer
sort < foo > foo
. Sauf que la redirection de sortie tronque le fichierfoo
en préparation pour recevoir la sortie. Et puis il n'y a rien à trier. Sans "-o" la manière de le faire seraitsort < foo > bar ; mv bar foo
. Je suppose que l'-o
option fait quelque chose de similaire sans que vous ayez à vous en soucier.la source
sudo sort -o /some/place
que votre utilisateur non privilégié n’a pas l’autorisation d’écrire.sponge
(une partie de moreutils). Pour la redirection privilégiée, il existe une tuyauterie vers| sudo tee
, qui présente également l’avantage de limiter l’augmentation des privilèges à un seul programme simpletee
.-o
optionsort
existât bien avant l'éponge. Il est au moins aussi vieux que 4.4-lite2 (c'est là que l'historique commence dans OpenBSD CVS). Et dans le cas où vous opérez sur un fichier non privilégié et écrivez dans une zone privilégiée, cela| sudo tee
fonctionne très bien, mais la plupart du temps, vous souhaitez que tout soit privilégié etsudo
vous bluffe. Etsudo grep file | sudo tee
c'est idiot.sort
doit lire l'intégralité de l'entrée avant de pouvoir produire quoi que ce soit, c'est pourquoi il peut écraser en toute sécurité son entrée. Il peut stocker les données en mémoire ou dans des fichiers temporaires avant de commencer la sortie.L'option '-o' était déjà dans
sort
la sixième édition d'UnixCependant, je conviens avec vous que cela ne fait pas partie de la philosophie Unix.
uniq
n'a pas eu cette option (etsort
n'a pas eu-u
alors).Sur mon PDP-11, j'ai utilisé un petit programme qui prend un paramètre:
Si
whatever
existait déjà, il écrirait tout, de stdin à un fichier temporaire, qui a été renomméwhatever
après que l'entrée stdin ait été tarie. De cette façon, vous pouvez diriger le résultat de n'importe quelle commande aurenac
lieu de le rediriger vers le nom du fichier sans risque d'écraser l'entrée. Résoudre le problème de réécriture de cette manière rend IMHO plus conforme à la philosophie Unix.Voici quelques ajouts ultérieurs au programme: ne pas écraser le fichier de sortie si rien n’est arrivé sur stdin (par exemple, suite à une mauvaise saisie d’une partie de la ligne de commande), et autoriser une option pour ajouter stdin au fichier nommé.
C’était l’un des premiers (sinon le premier) programmes C réels que j’ai réalisés (pour mon travail, j’ai principalement développé en Pascal sur ce système).
la source
apt
GNU / Linux à la saveur originale peuvent avoir une version réécrite de la fonctionnalitérenac
fournie, avec un programme appelésponge
(à partir deman
: absorber les entrées standard et écrire dans un fichier), package
moreutils`.sponge
n'amoreutils
été créé par GNU.