Quando è importante scrivere script portatili?


18

La maggior parte del codice che scrivo è in PHP. Di recente ho iniziato a studiare gli script di shell. La maggior parte delle risorse e dei tutorial che ho incontrato sono specifici di Bash. Alcuni avvertono dei bashismi e altri no. Ho letto molto qui e Stack Overflow.

Ogni volta che una risposta usa basismi , qualcuno inevitabilmente commenterà per dire:

Non dovresti usare <inserire qui bashism>. Non è portatile.

Questo succede anche quando la domanda è stata taggata bash. Per me, è come dire a un programmatore di PHP che non dovrebbero usare il codice nuovo in PHP 5 perché non può essere usato con PHP 4. O dire a qualcuno che non dovrebbero scrivere qualcosa per Mac perché non può essere usato Su Windows.

Quando scrivo in PHP, scelgo un requisito minimo e scrivo un codice compatibile con il forward . Non mi preoccupo di renderlo compatibile con le versioni precedenti.

Se uso #!/bin/bashcome shebang, perché non dovrei usare i bashismi? Sto iniziando a ottenere l'impressione che alcune persone come per bash bashismi (gioco di parole) solo per il gusto di farlo.

Le persone usano spesso bashe in modo shellintercambiabile, probabilmente a causa del fatto che bash è la shell predefinita su molti sistemi. Quindi posso capire l'aggiunta di un commento per avvertire che il codice utilizza bashismi, ma non capisco l'implicazione che è sbagliato usarli.

Ovviamente, se scrivo una sceneggiatura esclusivamente per uso personale, posso scriverla nella lingua che desidero. Ma mi piacerebbe pensare che parte del codice che scrivo potesse essere utile ad altri.

Ho provato a cercare una risposta alla mia domanda prima di pubblicare. Ho trovato molte informazioni su come testare la portabilità, ma non sono riuscito a trovare nulla su quando è importante farlo.

Quindi, quando è importante scrivere script portatili?

Per esempio,

  • quali tipi di script dovrebbero essere il più portatili possibile?
  • quanto sono comuni i sistemi su cui non è installato Bash?
  • se il sistema ha installato Bash, avrà anche la versione GNU di find e altre utilità?

4
Ho valutato questa domanda e ho risposto, ma più ci penso solo le ultime 2 domande si adattano al sito. Gli altri un "principalmente basato sull'opinione".
Jordan

1
C'è anche un meta aspetto in questa domanda: anche se potrebbe non aiutare la risposta iniziale alla domanda, commenti come "questo non è portatile" possono essere molto utili per gli altri lettori che si imbattono nella domanda / risposta mesi o anni dopo.
Bananguin,

2
@Bananguin I commenti che dicono "questo non è portatile" non mi disturbano. Questo è solo un FYI. Ho fatto questo tipo di commenti da solo. È il "Non dovresti usare ..." che mi dà fastidio. Implica che c'è qualcosa di sbagliato nella risposta. Ciò sarebbe valido se la risposta raccomandasse, ad esempio, un codice obsoleto. Quindi mi sono chiesto cosa c'è che non va in Bash.
Toxalot,

2
+1. Soprattutto quando la domanda ha un bashsolo tag, qualcuno commenta "È bashismo e non portatile". Quando rispondo a una domanda taggata C, non mi interessa se è portatile Javao meno.
PP,

4
Sento sempre bene sottolineare che si tratta di una bashfunzionalità specifica e non portatile, proprio come vorrei sottolineare che un'estensione specifica GNU viene utilizzata per alcune utilità (anche se la domanda è stata etichettata come Linux). Non ho mai visto nessuno dire "questo è un bashismo e non dovresti mai usarlo".
Martin Tournoij,

Risposte:


15

Come membro di questa comunità non vedo spesso persone che ignorano i bashismi per cose che colpiscono bash. Quando si parla di portabilità, i GNUismi sono molto peggio dei bashismi. Fintanto che usi bashper il tuo shebang, puoi aspettarti che lo script venga eseguito usando bash. Tuttavia, non è possibile garantire la versione se non si verifica esplicitamente. La versione 4 di Bash ha portato alcune utili funzioni come gli array associativi, ma Bash v3 è ancora ampiamente usato su OS X e RHEL 5.

quali tipi di script dovrebbero essere il più portatili possibile?

Si tratta più delle tue esigenze e di ciò che scegli di supportare come sviluppatore. Se stai scrivendo uno script di installazione per un'applicazione che supporta tutti i tipi di * NIX, la portabilità sarà molto importante.

quanto sono comuni i sistemi su cui non è installato Bash?

FreeBSD e Solaris 10 sono esempi di sistemi che non vengono forniti con bash installato di default. La maggior parte dei sistemi Linux lo avrà, ad eccezione dei sistemi integrati.

se il sistema ha installato Bash, avrà anche la versione GNU di find e altre utilità?

No, e questo è il vero problema della portabilità. Se la portabilità è importante, è necessario utilizzare solo le funzioni del comando shell definite dallo standard POSIX. Le utility GNU possono essere installate su sistemi non GNU come FreeBSD, ma è improbabile che siano prima in PATH e non puoi fare affidamento su quegli strumenti da installare.


1
Penso che sia più su SO che qui dove vedo spesso persone che ignorano i bashismi . So solo che l'ho notato abbastanza spesso da frustrarmi e spingermi a porre questa domanda.
Toxalot,

1
Quindi, se le utility GNU sono installate ma non prima in PATH, c'è un modo per chiamarle in modo specifico? Altrimenti, perché li hanno installati affatto?
Toxalot,

@toxalot: binari e script vengono chiamati esplicitamente usando percorsi assoluti.
Bananguin,

1
@Bananguin Quindi se qualcuno avesse installato i programmi di utilità Bash e GNU (ma non in PATH), potrebbero usare lo script se lo modificassero per usare percorsi assoluti per finde qualunque altro programma di utilità specifico per GNU che avevo usato? Ovviamente, ciò non sarebbe facile da usare per uno script di installazione. Ma sto pensando di mettere qualcosa su GitHub per gli altri da afferrare se lo desiderano. Non mi interessa che non sia portatile per tutti i sistemi. Non voglio che sia inutile su molti sistemi.
Toxalot,

1
@toxalot: sì, potrebbe funzionare. se metti qualcosa come FIND=/opt/gnu/dispicable/bin/findall'inizio del tuo script e poi usi ${FIND}invece che findnel tuo script dai alle persone un posto (!) per mettere i loro percorsi di installazione e fare in modo che il tuo script usi gli strumenti corretti.
Bananguin

5

Quindi, quando è importante scrivere script portatili?

quali tipi di script dovrebbero essere il più portatili possibile?

Quando li usi per il tuo ambiente di lavoro e lavori (o potresti in futuro) su macchine diverse - E, non devi riscrivere i tuoi strumenti prima di iniziare a lavorare.

ad esempio: uno script / rmsostituzione cestino


Mark Stewart:

... per il mio toolkit di risoluzione dei problemi suppongo che avrò solo la shell vi e Korn. E provo ad usare i comandi che funzionano sulla maggior parte dei gusti di Unix.


3
Mi piacciono alcuni "Bash-isms", ma per il mio toolkit di risoluzione dei problemi presumo che avrò solo la shell vi e Korn. E provo ad usare i comandi che funzionano sulla maggior parte dei gusti di Unix. In questo modo sono pronto a fare il triage su un sistema malato senza doversi preoccupare di come si comporta il comando ps, se Bash o Perl o PHP sono lì, o dove si trovano.
Mark Stewart,
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.