Qual è il più portatile di sed, awk, perl e sh?


15

Qualcuno può mettere questi strumenti in ordine di portabilità? Quale di questi è sicuro di essere trovato anche sui sistemi * nix più minimali? Qualcuno di loro è sicuro al 100% di essere presente? La mia ipotesi è che l'ordine sia il seguente:

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

Mentre immagino ci siano sistemi che non sono predefiniti a una shell bourne, alcune shell saranno presenti come predefinite, sarà sempre presente /bin/sh? Presumibilmente no se non è una shell di tipo bourne. Entrambi awke sedhanno pagine che li spiegano sulla specifica POSIX, quindi presumibilmente saranno sempre presenti. È così? Posso essere sicuro che entrambi saranno installati su qualsiasi * nix? Compresi i sistemi integrati?


i sistemi embedded spesso sacrificano la portabilità per rimanere minimi. Molti non sono conformi a POSIX.
Giordania,

@jordanm significa che potrebbero non avere nessuno di questi? Sto assumendo un sistema che fornisce almeno un'interfaccia shell minima. So che fornisce busybox e sh, ad esempio, anche il mio NAS basato su busybox ha perl. awksed
terdon

1
Potresti averli, ma ciò che fanno varierà tra i sistemi, quindi la domanda non ha molto senso come viene affermato.
Stéphane Chazelas,

@StephaneChazelas ah, potresti aiutarmi a restringerlo allora? Non è possibile ordinare questi in termini di probabilità che si possano trovare sul sistema X? La mia esperienza è strettamente Linux e un paio di sistemi NAS integrati. So che non otterrai mai un GNU / Linux senza tutti e 4 questi, ma non puoi darmi un'idea di quale di essi sia più sicuro presumere che sia presente?
terdon

Risposte:


15

Qual è il più portatile di sed, awk, perl e sh?

sed, shE awksono portatili essere specificato da POSIX, perlnon è come non essere sostenuta da uno standard.

Qualcuno può mettere questi strumenti in ordine di portabilità?

Se ti attieni al codice conforme, non dovrebbe esserci un ordine di portabilità per i tre comandi POSIX.

Quale di questi è sicuro di essere trovato anche sui sistemi * nix più minimali?

I tre POSIX insieme a molte altre utility sono obbligatori affinché un sistema operativo sia POSIX. Tuttavia, esistono sistemi operativi che ne mancano a causa della minimizzazione o che forniscono implementazioni incomplete / non conformi.

In realtà, la maggior parte (se non tutti) i sistemi operativi Unix gratuiti e open source probabilmente non supererebbero il processo di conformità nel caso dovessero provare, e comunque non provano mai.

Qualcuno di loro è sicuro al 100% di essere presente?

Sarei sorpreso di trovare un * nix come OS privo di una shell basata sulla sintassi Bourne, ma tutto è possibile, specialmente con i sistemi embedded.

La mia ipotesi è che l'ordine sia il seguente: Alcune shell saranno presenti come predefinite, sarà sempre in / bin / sh?

/bin/shè probabile che sia una shell della famiglia di sintassi Bourne ma non è garantito che sia conforme a POSIX, anche nei sistemi POSIX. Ad esempio, è /usr/xpg4/bin/shsu Solaris 10 e precedenti mentre /bin/shè la shell Bourne originale legacy che non è POSIX.


12

Prendi spunto dagli Autotools: atteniti al minimo comune denominatore di Bourne e POSIX shell - eventualmente aumentato da sed- se devi scrivere qualcosa che deve funzionare ovunque . Potrebbero esistere sistemi in cui qualcosa si rompe, ma è possibile aggirare tali problemi riscrivendo.

Ad esempio, alcuni sistemi antichi hanno problemi con errori di espansione in test, ovvero [:

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

quindi la pratica di Autoconf è di riscriverla tra virgolette doppie con un prefisso a singolo carattere, in questo modo:

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

Puoi anche usare "x$foo"qui. Questo protegge dalla possibilità che $foopotrebbe essere un'opzione valida per test(1), e poiché [è un alias per test, potrebbe interpretare erroneamente l'espressione. La soluzione è creare una situazione in cui l'argomentazione sconosciuta [con xcui iniziare sempre , il che significa che non può avere un significato speciale [.

(Autoconf consiglia inoltre di utilizzare testinvece di [, ma tale consiglio nasce come reazione a possibili conflitti con M4 , che utilizza anche [nella sua sintassi.)

awk è POSIX , quindi teoricamente è disponibile ovunque. È anche in Busybox , quindi avrai awkun'implementazione anche in alcuni sistemi Linux embedded molto restrittivi. Eppure, sarei meno sorpreso di imbattersi in un sistema senza awkrispetto sed. Suppongo che si riduca alla complessità: strumenti più semplici hanno maggiori probabilità di sopravvivere al triage aggressivo.

Perl non fa parte di alcuno standard diffuso, POSIX o altro, quindi semplicemente non puoi contare su di esso se non sai nulla in anticipo sull'ambiente di destinazione. Perl non è installato di default in:

  • Cygwin
  • FreeBSD e NetBSD
  • Installazioni "minimal" per alcuni Linux, incluso Slackware
  • molti Linux embedded che si basano principalmente su Busybox per la loro area utente

Il manuale di Autoconf contiene un capitolo sulla programmazione della shell portatile che dovrebbe esservi utile. Gli strumenti di ultima sezione riguarda piace sed, awke molti altri.


Grazie, ma mi chiedo l'ordine di portabilità di questi. Se ti leggessi bene, lo stai suggerendo she sedsei il più portatile. OK, e gli altri? Ed è shdavvero così portatile? Cosa succede se la shell predefinita è una derivata della shell C? Un tale sistema avrà ancora un collegamento simbolico a /bin/sh?
terdon

Grazie per la modifica, questo è il punto, entrambi sede awksono forniti da busybox, perché saresti più sorpreso di trovare sedassente? Hai idea se le alternative busybox forniscono anche sed e awk?
terdon

Ri: POSIX vs Bourne shell , riscritto il consiglio di attenersi al display LCD dei due. Ri: testando la citazione , ho sbagliato a ricordare il motivo, ma ho trovato il capitolo nel manuale di Autoconf in cui il motivo è coperto e ho modificato la risposta di conseguenza. Ri: sed vs awk e Busybox , ho spiegato che: maggiore complessità e triage. sedfa meno, quindi il suo binario sarà più piccolo, quindi ci sono meno motivi per rimuoverlo che awk, il che è abbastanza complesso. (20 kiB contro 48 kiB sul mio sistema.) Ri: Alternative Busybox , non sono a conoscenza di altre alternative allo shopping unico.
Warren Young

+1 Perché sono d'accordo con la tua premessa generale qui (che il minimo comune denominatore sarà una sorta di sh- strano che terdon si collochi awke al di sedsopra di questo o_O?) Anche se questo è solo coincidente con gli scopi di Autotool, poiché alcuni ambienti, in particolare quelli piccoli, potrebbe non essere destinato all'edilizia, periodo.
Riccioli d'oro

1
@WarrenYoung è il genere di cose che mi chiedevo. Non avevo (non avevo idea) se tutti i sistemi * nix avrebbero effettivamente installato una shell Bourne per impostazione predefinita. Se tutti hanno un /bin/sh, allora le cose sono diverse ma non sapevo che tutto avrebbe avuto uno. Mi dispiace di non averlo accettato a proposito, sono stato diviso tra le tue e le risposte di jlliagre, entrambe le quali hanno risposto alla mia domanda. Ho scelto il suo perché lo ha affrontato più direttamente e perché ha meno rappresentante :).
terdon
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.