PS1 = '$ (pwd)' perché funziona e perché è diverso da PS1 = $ (pwd)


18

Perché quando inserisco questo comando il prompt cambia nella mia directory?

PS1='$(pwd)'

Sto usando virgolette singole, il che significa che non c'è interpolazione, aka echo '$(pwd)'—— →$(pwd)

Inoltre, diciamo che abbiamo chiarito perché questo funziona ... perché funziona in modo diverso da PS1=$(pwd)? (senza virgolette)

Per diverso intendo che se uso le virgolette, il prompt continuerà a cambiare nella mia directory corrente mentre navigo attraverso il terminale. Ma se non uso le virgolette, il prompt rimarrà sempre la directory in cui mi trovavo la prima volta che ho inserito il comandoPS1=$(pwd)

perché?


2
Salva alcuni cicli della CPU e usa l'equivalente PS1 = '$ PWD'
jlliagre

Risposte:


29

Quando si assegna semplicemente un valore a una variabile, l' $(...)espressione viene valutata a meno che non sia racchiusa tra virgolette singole (o con escape di barra rovesciata). Per capire, prova a confrontare questi due:

A=$(pwd)
echo "$A"
B='$(pwd)'
echo "$B"

Il valore di Adiventa immediatamente la stringa /home/yourusernamee ovviamente non viene ricordato da dove provenga questa stringa, rimane lo stesso anche se cambi directory. Il valore di B, tuttavia, diventa la stringa letterale $(pwd)senza essere interpretato.

Ora, nel valore di PS1qualcosa di speciale accade: ogni volta che viene stampato il prompt, vengono interpretati alcuni costrutti speciali, ad esempio la sostituzione del comando $(...)viene eseguita esattamente come è accaduto sopra nell'assegnazione alla Avariabile. Ovviamente se il tuo PS1contiene la stringa letterale della tua home directory (come sopra con A) allora non c'è modo che possa cambiare. Ma se contiene la stringa $(pwd)(come sopra con B), viene valutata ogni volta che viene stampato il prompt e quindi viene visualizzata la directory effettiva.


14

In entrambi bash e zsh, il valore di PS1non viene utilizzato come prompt così com'è, subisce alcune espansioni. Le regole differiscono per i due gusci, ma in entrambi i casi, uno degli step è quello di eseguire espansioni “dollaro” (sostituzione variabile, sostituzioni comando, valutazione aritmetica) con la stessa sintassi normale sintassi shell ( , , o , , ) .$VARIABLE${VARIABLE}$(COMMAND)`COMMAND`$((EXPRESSION))$[EXPRESSION]

  • In bash, l'espansione del dollaro è attivata per impostazione predefinita, ma può essere disattivata con shopt -u promptvars.
  • In zsh, l'espansione del dollaro è disattivata per impostazione predefinita, ma molte persone (e la maggior parte dei framework di configurazione che troverai sul web) la accendono setopt prompt_subst.

Con l'espansione del dollaro nel prompt attivata, PS1='$(pwd)'imposta PS1il valore di 6 caratteri $(pwd)e quindi fa sì $(pwd)che venga sostituito, e quindi il pwdcomando da eseguire, ogni volta che la shell visualizza un nuovo prompt. D'altra parte, PS1=$(pwd)imposta PS1su qualunque sia l'attuale directory di lavoro della shell in quel momento. Se l'espansione del dollaro fosse disattivata PS1='$(pwd)', il prompt sarebbe la stringa letterale $(pwd).

Si noti che ci sono modi più convenienti per ottenere la directory di lavoro nel prompt:

  • In bash, con una escape backslash come \w, che abbrevia la tua home directory ~e può essere tagliata impostando PROMPT_DIRTRIM.
  • In zsh, con una percentuale di escape come %/o%~ ( %/è la stessa $PWD, %~abbrevia le home directory), che può avere un'impostazione di taglio.
  • In entrambe le shell (e in qualsiasi altra shell in stile Bourne), $PWDequivale a $(pwd): non è necessario eseguire un sottoprocesso per ottenere la directory di lavoro corrente.

7

Perché senza virgolette, $ (pwd) viene valutato quando è impostata PS1. Con le virgolette, la valutazione di $ (pwd) viene posticipata fino alla visualizzazione del prompt.

Senza virgolette, PS1 è impostato sulla directory corrente al momento dell'impostazione di PS1. Con le virgolette singole, PS1 è impostato su $ (pwd), il che significa che valuterà e stamperà la directory corrente ogni volta che viene visualizzato il prompt.

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.