Qual è il significato di $ {GZIP_BINDIR - '/ bin'} in bash?


13

Qualcuno può spiegare cosa significa questo comando?

PATH="${GZIP_BINDIR-'/bin'}:$PATH"; export PATH

Risposte:


19

${GZIP_BINDIR-'/bin'}è un bashmodello di espansione dei parametri. Da man bash:

${parameter:-word}
              Use Default Values.  If parameter is unset or null, 
the expansion of word is substituted.  Otherwise, the  value  of parameter
is substituted.

Immediatamente prima di questa porzione la pagina man ha (grazie a @jwodder per la notifica):

Omitting the colon results in a test only for a parameter that is unset.

Come dice la manpage, imposterà il valore predefinito della variabile GZIP_BINDIR. Se in GZIP_BINDIRprecedenza è stato impostato un valore (diverso da null in quanto non utilizzato :), verrà utilizzato tale valore, altrimenti /binverrà utilizzato come valore della variabileGZIP_BINDIR .

D'altra parte, se si desidera verificare anche valori null, utilizzare questo modello (include :):

${GZIP_BINDIR:-'/bin'}

Dopodiché il file $PATHverrà espanso ai valori precedentemente contenuti. Quindi, se in PATHprecedenza aveva:

/usr/sbin:/usr/bin

Ora PATHsarai (considerando che GZIP_BINDIRnon è impostato):

/bin:/usr/sbin:/usr/bin

export PATHrenderà questo PATHdisponibile a tutti i processi figlio.


" Penso che ti sia sfuggito un :in${GZIP_BINDIR-'/bin'} " Non necessariamente. ${parameter-word}è anche valido, anche se non sembra essere nella pagina man.
nyuszika7h,

@ nyuszika7h Sì ... non lo sapevo prima ... strano perché non è incluso nella manpage ..
heemayl

Nella manpage di bash sul mio computer, il paragrafo sopra la sezione su :-dice: "Quando non si esegue l'espansione di sottostringa, usando i moduli documentati di seguito (es. :-), bash testa un parametro non impostato o nullo. Omettere i due punti risulta in un test solo per un parametro non impostato. "
jwodder,

Come nota a margine, puoi combinare l'impostazione di PATHe la exportin un singolo comando come segue:export PATH="${GZIP_BINDIR-'/bin'}:$PATH"
Paddy Landau,

8

Non ci sono davvero due punti prima del trattino all'interno dell'espansione dei parametri ${GZIP_BINDIR-'/bin'} ?

Questo tipo di costrutto è quasi sempre scritto con due punti, come in ${GZIP_BINDIR:-'/bin'} che "se $ GZIP_BINDIR è NULL o non è impostato, impostarlo su '/ bin'"

Tuttavia, la sintassi fornita è valida, ma rara. ${GZIP_BINDIR-'/bin'}(senza due punti) significa "se $ GZIP_BINDIR non è impostato, impostarlo su '/ bin'". Se è impostato (è stato dichiarato) ma non è stato assegnato nulla (ad es. È NULL), non verrà inserito nulla.

Potrebbe esserci un bug qui, poiché i due punti che seguono il costrutto variabile (...} :$ PATH ...) verranno comunque inseriti se $ GZIP_BINDIR è impostato ma NULL. Poiché ciò aggiungerebbe due punti all'inizio di $ PATH, per prima cosa verrà cercata la directory corrente.

Questo è considerato dalla maggior parte un problema di sicurezza in quanto semplifica l'esecuzione di un programma dannoso con lo stesso nome dei comandi standard semplicemente inserendolo nella directory corrente.

Per lasciare $ PATH invariato se $ GZIP_BINDIR è impostato ma NULL (vuoto), la sintassi corretta sarebbe ${GZIP_BINDIR-'/bin:'}$PATH; export PATH

Per lasciare $ PATH invariato se $ GZIP_BINDIR non è impostato o è impostato ma NULL, la sintassi corretta sarebbe ${GZIP_BINDIR:-'/bin:'}$PATH; export PATH


2

Questo comando aggiorna la variabile PATH.

Il PATHè una variabile d'ambiente che specifica una serie di directory in cui si trovano i programmi eseguibili.

PATH="${GZIP_BINDIR-'/bin'}:$PATH";

Questo aggiunge il valore di un'altra variabile GZIP_BINDIRse esci dal PATH precedente altrimenti usa / bin e lo aggiungi a PATH

export PATH

L'esportazione viene utilizzata per impostare il PERCORSO disponibile per tutti i processi secondari e i subshells Leggi questo per ulteriori informazioni su

Devi notare che questo non è statico e lo perderai una volta uscito dalla shell.

Per rendere permanente questa modifica del PERCORSO devi aggiungere queste righe al tuo .bashrc

gedit .bashrc

e aggiungi la linea

export PATH="${GZIP_BINDIR-'/bin'}:$PATH"

quindi esegui il comando

source .bashrc

GZIP_BINDIR è la variabile
Maythux,

cosa non è giusto? No non l'ho fatto? il mio è anche
sottoposto a downgrade

Perché effettuare il downvoting ?!
Maythux,
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.