Cosa significa $ {PATH: +: $ {PATH}}?


25

Di recente ho notato quanto segue nel mio profilo cygwin, più precisamente:

/usr/local/bin:/usr/bin${PATH:+:${PATH}}

Cosa significa? Perché non è solo $ PATH? È un 'se $ PATH esiste quindi aggiungi: $ PATH'? Il mio scopo è scambiare l'ordine e mettere i percorsi cygwin dietro il percorso di Windows. In passato avrei

$PATH:/usr/local/bin:/usr/bin

ma questo mi confonde. Forse dovrei fare

PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"

aggiungere il: alla fine del $ PATH?


1
Il titolo della tua domanda ha davvero incasinato la formattazione nella barra laterale delle Domande frequenti di
Brad

Risposte:


39

La :+è una forma di espansione di parametro :

$ {parametro: + [parola]} : usa valore alternativo.

Se il parametro non è impostato o è nullo, è necessario sostituire null; in caso contrario, verrà sostituita l'espansione della parola (o una stringa vuota se la parola viene omessa).

In altre parole, se la variabile $varè definita, echo ${var:+foo}stamperà fooe, in caso contrario, stamperà la stringa vuota.

Il secondo :non è niente di speciale. È il personaggio usato come separatore nell'elenco delle directory in $PATH. Quindi, PATH="/usr/local/bin:/usr/bin${PATH:+:${PATH}}"è un modo abbreviato di scrivere:

if [ -z "$PATH" ]; then
    PATH=/usr/local/bin:/usr/bin
else
    PATH=/usr/local/bin:/usr/bin:$PATH
fi

È solo un trucco intelligente per evitare di aggiungere un extra :quando $PATHnon è impostato. Per esempio:

$ PATH="/usr/bin"
$ PATH="/new/dir:$PATH" ## Add a directory
$ echo "$PATH"
/new/dir:/usr/bin

Ma se PATHnon è impostato:

$ unset PATH
$ PATH="/new/dir:$PATH"
$ echo "$PATH"
/new/dir:

A :da solo aggiunge la directory corrente a $PATH. L'uso PATH="/new/dir${PATH:+:$PATH}"evita questo. Quindi certo, puoi usare PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"se vuoi, oppure puoi usare PATH="$PATH:/usr/local/bin:/usr/bin"se preferisci. L'unica differenza è che il primo potrebbe aggiungere un extra :, aggiungendo così la directory corrente alla tua $PATH.


È extra :dannoso?
gatto

4
@tac non proprio, aggiunge semplicemente la directory corrente alla tua $PATH(vedi la risposta di @ AndyB ). Questo può essere un rischio per la sicurezza in alcune situazioni (supponiamo che un utente malintenzionato abbia caricato uno script distruttivo nella directory corrente e l'abbia chiamato lso qualcosa del genere), ma nella maggior parte dei casi non ti dispiace davvero. In effetti, alcuni sistemi aggiungono comunque la directory corrente in modo PATHpredefinito.
terdon

il percorso è l' unico posto in cui preferirei che lo cshgestiscano in modo che sia un array.
hometoast

8

Hai ragione, significa "se $ PATH esiste - e non è null - quindi aggiungi: $ PATH".

È necessario verificare se $ PATH esiste perché non si desidera aggiungere i due punti iniziali (o finali) se $ PATH non è definito. Un nome di directory di lunghezza zero (null) nel percorso, come in :/usr/local/bin:/usr/bin, o /usr/local/bin:/usr/bin:, o /usr/local/bin::/usr/bin, significa cercare la directory corrente .

Estratto da man bash:

   PATH   ...
          A zero-length (null) directory name in the value of PATH indicates 
          the current directory.  A  null  directory name may appear as two 
          adjacent colons, or as an initial or trailing colon.
          ...

Probabilmente non è quello che vuoi fare.

Le seguenti due righe fanno la stessa cosa:

PATH=":/bin"        # search current directory, then /bin
PATH=".:/bin"
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.