9
votes

Commande Echo gonflée

Regardez les implémentations suivantes de la commande "Echo":


0 commentaires

3 Réponses :


7
votes

Vous remarquerez qu'il n'y a pas vraiment beaucoup de croissance de BLOAT.

  1. La plupart des lignes du code sont des commentaires. LI>
  2. La plupart des lignes de code qui ne sont pas des commentaires, sont la documentation d'utilisation, alors quand quelqu'un va "echo - help" il fera quelque chose. Li>
  3. le code en dehors de ce qui précède apparaît en grande partie pour gérer les arguments peut prendre, ainsi que l'expansion "spéciale" pour les symboles tels que \ n et \ t pour être leurs personnages équivalents au lieu de les faire écho littéralement. Li > ol>

    aussi, la plupart du temps, vous n'exécutez même pas la commande ECHO, la plupart du temps "ECHO" invoque une coquille intégrée. Au moins sur ma machine, vous devez taper / bin / echo -help code> pour obtenir toutes les fonctionnalités / documents avancées de celui-ci, car echo --help code> est simplement d'écho - Aide CODE> P>

    Pour un bon exemple, exécutez ceci dans votre shell. p> xxx pré>

    puis exécutez ceci: p >

    $echo '\x64\x65\x66'
    \x64\x65\x66
    
    $echo -e '\x64\x65\x66'
    def
    


7 commentaires

Je ne sais aucun c mais quelque chose de Cleary regarde un peu bonkers. Par exemple. Lignes 90 ~ 103 dans l'echo GNU, il convertit des trucs hexadécimaux aux entiers. Mais pourquoi? OpenBSD peut faire écho texte sans jouer avec des chiffres hexadécimaux ou quoi que ce soit d'autre qui n'est pas du texte. Comme je l'ai dit, je ne sais aucun c; Alors s'il vous plaît corrigez-moi si je me trompe.


@Joe: L'openbsd suffit à copie des arguments de commande à STDOUT, le GNU ONE peut réellement traiter les données. Voir mon exemple. Ensuite, essayez-le sur OPENBSD en utilisant le chemin absolu d'echo 'au lieu de s'appuyer sur la coquille intégrée.


Ainsi, GNU met en œuvre une simple regex dans moins de 300 lignes, y compris des commentaires et une licence. Je suis impressionné! Merci.


@Kent Fredric: Néanmoins, c'est assez agréable compte tenu de la taille. Je ne peux pas croire que je ne connaissais jamais!


ECHO --HELP ne devrait jamais echo ' - Aide ' et une nouvelle ligne. Tout ce qui est d'autre est une interprétation erronée de ce que 'Echo' est pour.


La version GNU fait réellement exactement la même chose (moins l'extension BSD -N valide) lorsqu'elle est exécutée avec la variable d'environnement posially_correct définie et dans une coque normale qui traite déjà des caractères échappés.


Et je n'appelerais pas la version FreeBSD "Ballonné". Ils essaient évidemment d'avoir la version la plus rapide et la plus petite au détriment de la lisibilité.



14
votes

Dans leur "conception du programme de l'environnement UNIX", Pike & Kernighan Discutez de la manière dont le programme CAT CODE> a accrédé les arguments de contrôle. Quelque part, mais pas cet article, il y avait un commentaire sur " chat code> est revenu de Berkeley waving drapeaux". Ceci est un problème similaire au problème avec echo code> de développement d'options. (J'ai trouvé une référence à l'article pertinent de la page d'homme BSD (Mac OS X) pour CAT CODE>: ROB PIKE, "STYLE UNIX, ou CAT -V considéré comme nocif" em> , USENIX été rendu de la conférence, 1983. Voir aussi http://quotes.cat-v.org/programming/ )

Dans leur livre 'L'environnement de programmation UNIX', Kernighan & Pike (oui, ces deux) citer Doug McIlroy sur le sujet de ce que "Echo" devrait faire sans argument (vers 1984):

Une autre question de philosophie est ce que écho code> devrait faire s'il n'est donné aucun argument - spécifiquement, il doit imprimer une ligne vierge ou rien du tout. Tous les implémentations actuelles ECHO CODE> Nous savons imprimer une ligne vide, mais les versions antérieures non, et il y avait de grands débats sur le sujet. Doug McIlroy a conféré le bon sentiment de mysticisme dans sa discussion sur le sujet: p> blockQuote>

l'UNIX et l'ECHO H3>

Il y a habité dans le pays du New Jersey The Unix, une fille foire que les Savants ont voyagé loin pour admirer. Ébloui par sa pureté, tous cherchés à l'épouser, l'un pour sa grâce virginal, une autre pour sa civilité polie, une autre pour son agilité dans la réalisation de tâches exigeantes rarement accomplies même dans beaucoup de terres plus riches. Si grande de cœur et pouvant accueillir de la nature était-elle que l'UNIX a adopté tous mais les plus insuffisamment riches de ses prétendants. Bientôt, de nombreuses progénitures ont grandi et ont prospéré et se propagent jusqu'aux extrémités de la terre. P>

Nature elle-même sourit et répondit à l'UNIX plus avec impatience que d'autres êtres mortels. Humbler folk, qui savait peu de mœurs de courtoisie, ravi de sa echo em>, si précis et cristallin qu'ils sont rares croyaient pouvoir être répondu par les mêmes rochers et les mêmes bois qui ont tellement brouillé leurs propres cris dans le désert . Et la conformité Unix obligé avec des échos parfaits de tout ce qu'elle a été demandé. P>

Quand une Swaine impatiente a demandé à UNIX, "echo rien", l'UNIX ouvrit obligément la bouche, n'a rien fait écho et la refermit à nouveau. P>

'Quoi que tu veux dire, "les jeunes ont demandé", ouvrant ta bouche comme ça? Désormais n'ouvre jamais ta bouche quand tu es censé écho à rien! " Et l'UNIX obligé. P>

'Mais je veux une performance parfaite, même lorsque vous ne faites rien, "a plaidé un jeune sensible" et aucun échos parfait ne peut venir d'une bouche fermée.' Ne souhaitant pas offenser l'un ni l'autre, l'UNIX a accepté de dire différentes notes pour la jeunesse impatiente et la jeunesse insensible. Elle a appelé le sensible Rien " \ n code>". P>

Encore maintenant quand elle a dit ' \ n code>', elle ne disait pas vraiment rien pour qu'elle devait ouvrir sa bouche deux fois, une fois pour dire ' \ n code>' et Une fois pour ne rien dire, et elle n'a donc pas plu à la jeunesse sensible, qui a dit immédiatement, "le \ n code> sonne comme un parfait pour moi, mais la seconde la ruine. Je veux que vous en repreniez l'un d'eux. Donc, l'UNIX, qui ne pouvait pas rester offensant, accepté d'annuler certains échos et appelé que ' \ C code>'. Maintenant, les jeunes sensibles pouvaient entendre un écho parfait de rien en demandant ' \ n code>' et ' \ c code>' ensemble. Mais ils disent qu'il est mort d'une base de notation avant d'en entendre un. P> blockQuote>


Le shell Korn introduit (ou, au moins, inclus) A PRINTF code> basé sur la fonction de langage C printf () code> , et qui utilise une chaîne de format pour contrôler la manière dont le matériau devrait apparaître. C'est un meilleur outil pour un formatage complexe que echo code>. Mais, en raison de l'histoire décrite dans la citation, echo code> ne fait plus écho plus en écho; Il interprète ce qu'il est donné à echo. p>

et interprétant les arguments de ligne de commande à echo code> nécessite indubitablement plus de code que de ne pas l'interpréter. Une commande ECHO de base est la suivante: P>

#include <stdio.h>
int main(int argc, char **argv)
{
    const char *pad = "";
    while (*++argv)
    {
        fputs(pad, stdout);
        fputs(*argv, stdout);
        pad = " ";
    }
    fputc('\n', stdout);
    return 0;
}


0 commentaires

1
votes

Je ne sais pas si j'aime la première mise en œuvre: elle a une option trop nombreuses!

Si une option -N est requise, ajoutez également une option d'option - pour arrêter le traitement des options serait utile. De cette façon si vous écrivez un script shell qui lit et imprime la saisie de l'utilisateur, vous n'obtenez pas de comportement incohérent si les types d'utilisateurs -N . .


0 commentaires