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.