Quel est le plus portable de sed, awk, perl et sh?

15

Quelqu'un peut-il mettre ces outils par ordre de portabilité? Lequel de ces certains se trouvent même sur les systèmes les plus nix minimal de *? L'un d'eux est-il sûr à 100% d'être présent? Je suppose que la commande est la suivante:

  1. awk
  2. sed
  3. sh
  4. perl

Bien que j'imagine qu'il existe des systèmes qui ne sont pas définis par défaut sur un shell bourne, certains shell seront présents par défaut, est-ce toujours le cas /bin/sh? Vraisemblablement pas si ce n'est pas un obus de type bourne. Les deux awket sedont des pages les expliquant sur la spécification POSIX, donc ils seront probablement toujours présents. Est-ce vrai? Puis-je être sûr que les deux seront installés sur n'importe quel * nix? Y compris les systèmes embarqués?

terdon
la source
les systèmes embarqués sacrifient souvent la portabilité pour rester minimes. Beaucoup ne sont pas conformes à POSIX.
jordanm
@jordanm que cela veut dire qu'ils pourraient peut - être pas une de ces? Je suppose un système qui fournit au moins une interface shell minimale. Je sais que busybox fournit sh, awket sedpar exemple et mon NAS basé sur busybox a également perl.
terdon
1
Vous les avez peut-être, mais ce qu'ils font variera d'un système à l'autre, donc la question n'a pas beaucoup de sens comme cela est indiqué.
Stéphane Chazelas
@StephaneChazelas ah, pourriez-vous m'aider à le réduire alors? N'est-il pas possible de les trier en fonction de leur probabilité de les trouver sur le système X? Mon expérience est strictement Linux et quelques systèmes NAS embarqués. Je sais que vous n'obtiendrez jamais de GNU / Linux sans ces 4 mais ne pouvez-vous pas me donner une idée de laquelle est la plus sûre à supposer d'être présente?
terdon

Réponses:

15

Quel est le plus portable de sed, awk, perl et sh?

sed, shet awksont portables étant spécifié par POSIX, perln'est pas comme n'étant pas soutenu par une norme.

Quelqu'un peut-il mettre ces outils par ordre de portabilité?

Si vous vous en tenez au code conforme, il ne devrait y avoir aucun ordre de portabilité pour les trois commandes POSIX.

Laquelle de celles-ci peut être trouvée même sur les systèmes * nix les plus minimes?

Les trois POSIX ainsi que de nombreux autres utilitaires sont obligatoires pour qu'un OS soit POSIX. Il existe cependant des systèmes d'exploitation qui en manquent en raison de la minimisation ou qui fournissent des implémentations incomplètes / non conformes.

En fait, la plupart (sinon la totalité) des systèmes d'exploitation Unix gratuits et open source, comme ceux d'Unix, ne passeraient probablement pas le processus de conformité s'ils essayaient, et ils n'essaient jamais de toute façon.

L'un d'eux est-il sûr à 100% d'être présent?

Je serais surpris de trouver un * nix comme OS sans shell basé sur la syntaxe Bourne, mais tout est possible, surtout avec les systèmes embarqués.

Je suppose que l'ordre est le suivant: un shell sera présent par défaut, sera-ce toujours à / bin / sh?

/bin/shest probablement un shell de la famille de syntaxe Bourne, mais il n'est pas garanti qu'il soit compatible POSIX, même en systèmes conformes POSIX. Par exemple, il se trouve /usr/xpg4/bin/shsur Solaris 10 et les versions antérieures, tandis que /bin/shle shell Bourne d'origine hérité n'est pas POSIX.

jlliagre
la source
12

Inspirez-vous des Autotools: respectez le plus petit dénominateur commun de Bourne et du shell POSIX - éventuellement augmenté de sed- si vous devez écrire quelque chose qui doit fonctionner partout . Il peut exister des systèmes où quelque chose se casse, mais vous pouvez contourner ces problèmes en réécrivant.

Par exemple, certains systèmes anciens ont des problèmes avec des erreurs d'extension dans test, alias [:

 if [ $foo = bar ] ; then...

donc la pratique Autoconf est de le réécrire entre guillemets avec un préfixe de caractère unique, comme ceci:

 if [ x"$foo" = "xbar" ] ; then...

Vous pouvez également utiliser "x$foo"ici. Cela protège contre la possibilité qui $foopourrait être une option valide pour test(1), et comme [c'est un alias pour test, cela pourrait mal interpréter l'expression. La solution est de mettre en place une situation où l'argument inconnu [commence toujours parx , ce qui signifie qu'il ne peut pas avoir de signification particulière pour [.

(Autoconf recommande également d'utiliser à la testplace de [, mais cet avis survient en réaction à d'éventuels conflits avec M4 , qui utilise également [dans sa syntaxe.)

awk est POSIX , donc théoriquement il est disponible partout. C'est même dans Busybox , donc vous aurez une awkimplémentation même dans certains systèmes Linux embarqués très restrictifs. Pourtant, je serais moins surpris de tomber sur un système sans awkque sed. Je suppose que cela se résume à la complexité: des outils plus simples sont plus susceptibles de survivre à un triage agressif.

Perl ne fait partie d'aucune norme répandue, POSIX ou autre, vous ne pouvez donc pas compter dessus si vous ne savez rien à l'avance sur l'environnement cible. Perl n'est pas installé par défaut dans:

  • Cygwin
  • FreeBSD et NetBSD
  • installations "minimales" pour certains Linux, y compris Slackware
  • de nombreux Linux embarqués qui dépendent principalement de Busybox pour leur espace utilisateur

Le manuel Autoconf contient un chapitre sur la programmation de shell portable qui devrait vous être utile. La dernière section couvre des outils comme sed, awket bien d' autres.

Warren Young
la source
Merci, mais je m'interroge sur l'ordre de portabilité de ces derniers. Si je vous ai bien lu, vous le suggérez shet ce sedsont les plus portables. OK, qu'en est-il des autres? Et est-ce shvraiment portable? Et si le shell par défaut est un dérivé du shell C? Un tel système aura-t-il toujours un lien symbolique sur /bin/sh?
terdon
Merci pour l'édition, c'est la chose cependant, les deux sedet awksont fournis par busybox, pourquoi seriez-vous plus surpris de vous sedabsenter? Avez-vous une idée si les alternatives à busybox fournissent également sed et awk?
terdon
Re: POSIX vs Bourne shell , réécrit le conseil de s'en tenir à l'écran LCD des deux. Re: test citant , j'ai mal mémorisé la raison, mais j'ai trouvé le chapitre dans le manuel Autoconf où la raison est couverte, et édité la réponse en conséquence. Re: sed vs awk et Busybox , j'ai expliqué que: plus de complexité et de triage. sedfait moins, donc son binaire sera plus petit, donc il y a moins de raisons de le supprimer que awk, ce qui est assez complexe. (20 Ko contre 48 Ko sur mon système.) Re: alternatives Busybox , je ne connais aucune autre alternative à guichet unique.
Warren Young
+1 Parce que je suis d'accord avec votre prémisse générale ici (que le plus petit dénominateur commun sera une sorte de sh- étrange que terdon se classe awket sedau-dessus de cet o_O?), Bien que ce ne soit qu'une coïncidence avec les objectifs d'Autotool, car certains environnements, en particulier les plus petits, peut ne pas être destiné à la construction, point final.
goldilocks
1
@WarrenYoung, c'est le genre de choses que je me demandais. Je n'ai (eu) aucune idée si tous les systèmes * nix auraient un shell bourne installé par défaut. S'ils en ont tous un /bin/sh, alors les choses sont différentes mais je ne savais pas que tous en auraient un. Désolé de ne pas avoir accepté cela au fait, j'étais partagé entre les réponses de la vôtre et celles de jlliagre qui ont toutes deux répondu à ma question. J'ai choisi le sien car il le traitait plus directement et parce qu'il a moins de rep :).
terdon