Predefinito Bash 3 sovrascrivendo shebang / bin / bash con brew installato bash 4

4

Sfondo

Bash 4 installato con successo usando homebrew e i passaggi aggiuntivi necessari per rendere bash 4 la shell predefinita. Molte guide in rete con un semplice google: Esempio Bash 4 guida all'upgrade per Mac

  • Bash 4.x (installato tramite brew) posizione: /usr/local/bin/bash
  • Posizione Bash 3.2 (Default OSX): /bin/bash

Problema

Script Non posso controllare / modificare lo shebang , poiché interesserebbe altri utenti. A meno che non dovessi cambiare manualmente e quindi annullare prima di eseguire il controllo del codice sorgente. Un'altra opzione è quella di digitare: bash some_script_with_bin_bash_shebang.sh per forzare l'uso della shell di bash 4 di recente aggiunta.

Ho sempre e solo bisogno di farlo per la funzionalità di Bash 4+, che è molto comune ora.

Domanda

Qualcuno ha una tecnica interessante, soluzioni alternative per creare alias un percorso bash shebang in questo modo: #!/bin/bash alla nuova shell di bash 4 in /usr/local/bin/bash ?

Senza ovviamente modificare il file! ^ _ ^ (ad esempio aggiungendo #!/usr/bin/env bash )

    
posta RST 15.01.2018 - 23:57
fonte

2 risposte

2

In primo luogo, potresti considerare semplicemente la sostituzione di /bin/bash con una versione più aggiornata.

In secondo luogo, se non ti senti a tuo agio invalidando la tua garanzia e quando hai già un problema con uno script esistente, ignora la sua #! riga invocandola come:

/usr/local/bin/bash /path/to/script.bash args...

(Puoi utilizzare bash anziché /usr/local/bin/bash se la tua $PATH è nell'ordine corretto.)

In terzo luogo, se questo script è specifico per i dispositivi Apple e deve avere Bash versione 4, quindi impostarlo sempre su #!/usr/local/bin/bash , poiché non vi è alcun vantaggio impostarlo su qualsiasi altra cosa.

In quarto luogo, considera l'utilizzo del link - tieni presente che hai bisogno della versione "sorgente" dello script per non essere in /usr/local/bin ; direttamente nel repository di origine sarebbe l'ideale.

Sorgente vs Distribuisci

La tua domanda sull'impostazione della riga #! nel repository source mette in luce una malintesa estremamente diffusa sugli script: l'idea che uno script, semplicemente perché è "testo", non dovrebbe essere necessario "preparato per l'uso" in qualsiasi senso.

Per altri tipi di programmi è ovvio: devono essere compilati. E se sono grandi script python o perl, hanno bisogno di un pacchetto o di un programma di installazione che includa tutte le dipendenze dei moduli.

Ma anche uno script di shell ha bisogno, come minimo, di avere la proprietà e le autorizzazioni impostate e di essere collocato in una directory bin . In genere ciò si verifica quando un pacchetto viene creato per una classe di dispositivo o quando lo script è installato su un dispositivo di destinazione. Questo è anche il momento appropriato per impostare la riga #! in modo che corrisponda all'ambiente di distribuzione.

Faccio non consiglio #!/usr/bin/env bash

La diffusa promozione di #!/usr/bin/env indebolisce leggermente la sicurezza generale, ma in un modo che probabilmente non morde le persone che lo scrivono, solo gli utenti da qualche parte lungo la traccia. Perciò non lo consiglio; anzi, prevedo che alla fine tornerà e morderà i tuoi clienti, i clienti dei tuoi clienti o i client dei tuoi clienti ....

È promosso come "portatile", ma non è vero: i dispositivi Android e OpenWRT non hanno nemmeno /usr molto meno /usr/bin/env , quindi è abbastanza inutile lì. Quindi, in pratica, i principali beneficiari sono gli utenti Apple.

Se lo script richiede una nuova versione di bash, la versione di sistema semplicemente non funzionerà, quindi è inutile usarla come fallback. Se non hai bisogno dell'ultima versione, allora averla corretta come / bin / bash va bene.

In breve, se stai distribuendo uno script ad Apple che richiede Bash versione 4, allora dovresti usare #!/usr/local/bin/bash , sia quando lo script viene creato in un pacchetto installabile, sia quando lo script è installato su un particolare dispositivo.

    
risposta data 13.03.2018 - 08:06
fonte
1

Questa è la ragione principale al giorno d'oggi per usare un diverso shebang:

#!/usr/bin/env bash

Questo utilizzerà la prima bash nel PATH, che molto probabilmente sarà l'ultima versione. Poiché / bin si trova nel percorso standard ( getconf PATH ), ricade con garbo per coloro che non hanno una bash personalizzata.

    
risposta data 16.01.2018 - 00:09
fonte

Leggi altre domande sui tag