Pourquoi trier -o est-il utile?

32

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 sortcommande, au moins GNU sort, a une -ooption permettant d’afficher dans un fichier au lieu de stdout. Pourquoi, par exemple, est sort foobar -o whateverutile quand je peux juste sort foobar > whatever?

combattant
la source
3
GNU n'est pas UNIX. Sous de nombreux aspects, il en va différemment, par exemple des arguments verbeux (--help, etc.).
Sakisk
@faif oui c'est vrai . mais je dirais que ce n'est pas une réponse à cette question spécifique.
Strugee
2
C'est pourquoi je l'ai laissé comme commentaire et non comme réponse :)
sakisk

Réponses:

47

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 fichier fooen préparation pour recevoir la sortie. Et puis il n'y a rien à trier. Sans "-o" la manière de le faire serait sort < foo > bar ; mv bar foo. Je suppose que l' -ooption fait quelque chose de similaire sans que vous ayez à vous en soucier.

Kurtm
la source
12
Vous pouvez également dire sudo sort -o /some/placeque votre utilisateur non privilégié n’a pas l’autorisation d’écrire.
bahamat
8
Et pour éviter toute confusion avec le commentaire de bahamat: il ne dit pas qu'ils peuvent trier un fichier pour lequel ils ne disposent pas de permissions. La redirection d'E / S fonctionne ... mal avec sudo. Puisque la redirection a lieu dans votre shell (sudo n’est qu’une commande à exécuter), l’utilisation de la redirection avec une commande via sudo est ennuyeuse. (Au départ, j'étais confus quant à ce que Bahamat disait, alors imaginé que d'autres pourraient l'être aussi).
Kurtm
3
Juste pour faire valoir l’avocat du diable, il existe en fait des alternatives au problème de "redirection privilégiée" et de "redirection privilégiée" du fichier "est identique à celui du fichier de sortie". Pour "entrée = sortie", il y a 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 simple tee.
jw013
Bons points. Bien que l' -ooption sortexistâ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 teefonctionne très bien, mais la plupart du temps, vous souhaitez que tout soit privilégié et sudovous bluffe. Et sudo grep file | sudo teec'est idiot.
Kurtm
1
sortdoit 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.
Stéphane Chazelas
12

L'option '-o' était déjà dans sortla sixième édition d'Unix

Cependant, je conviens avec vous que cela ne fait pas partie de la philosophie Unix. uniqn'a pas eu cette option (et sortn'a pas eu -ualors).

Sur mon PDP-11, j'ai utilisé un petit programme qui prend un paramètre:

renac whatever

Si whatever existait déjà, il écrirait tout, de stdin à un fichier temporaire, qui a été renommé whateveraprès que l'entrée stdin ait été tarie. De cette façon, vous pouvez diriger le résultat de n'importe quelle commande au renaclieu 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).

Anthon
la source
Si j'ai bien compris, les personnes aptGNU / Linux à la saveur originale peuvent avoir une version réécrite de la fonctionnalité renacfournie, avec un programme appelé sponge(à partir de man: absorber les entrées standard et écrire dans un fichier ), package moreutils`.
41754
@uprego. Je viens de chercher a la source de sponge.c et il semble y avoir beaucoup de surcharge de code en raison de la fonctionnalité sponging (stdin -> stdout).
Anthon
@uprego ni spongen'a moreutilsété créé par GNU.
jw013
Je n'ai pas eu l'intention de l'affirmer.
41754