Come posso modificare una variabile in una shell in esecuzione?


8

Sto modificando il mio prompt di PS1 e non voglio continuare ad approvvigionare il mio bashrc per aggiornarlo (dal momento che il mio bashrc ripristina anche altre cose). Inoltre, non voglio copiarlo e incollarlo più volte. C'è un modo per modificare la variabile in modo interattivo, come usare nano(il mio editor predefinito)?

La PS1 è principalmente un esempio, perché voglio fare la stessa cosa con altri vars. Il motivo per cui voglio farlo in modo interattivo è che la variabile è già piuttosto lunga e ho solo bisogno di modificarne alcuni caratteri. E ho solo bisogno di cambiarlo nella shell corrente.

Risposte:


8

Questo può essere fatto. Digita var=$vare quindi espandi e modifica. Per espandere, utilizzare Esc+ Ctrle(il collegamento predefinito, controllare l'output di bind -p | grep shell-expand-lineper confermare).

Così:

muru@muru-1604:~$ PS1=$PS1

diventerà:

muru@muru-1604:~$ PS1=${debian_chroot:+($debian_chroot)}\u@\h:\w\$

Che è quindi possibile modificare in un editor con Ctrlx Ctrle( edit-and-execute-commandin termini readline). Quando si salva e si esce, il contenuto salvato verrà eseguito dalla shell.

Se hai già PS1=...nella tua storia, puoi semplicemente tornare a quello e Ctrlx Ctrle.

Dal manuale di bash :

shell-expand-line (M-C-e)

Espandi la linea come fa la shell. Ciò esegue l'espansione dell'alias e della cronologia, nonché tutte le espansioni delle parole della shell.

edit-and-execute-command (C-xC-e)

Richiamare un editor sulla riga comandi corrente ed eseguire il risultato come comandi shell. Bash tenta di invocare $ VISUAL, $ EDITOR ed emacs come editor, in questo ordine.


Bello! Solo Esc, Ctrl + E è esattamente quello che stavo cercando. Anche se quando ho digitato PS1='$PS1', ha eliminato le virgolette, ma la digitazione PS1=\'$PS1\'funziona perfettamente.
wjandrea,

E leggendo bind -p, ho anche scoperto che puoi espandere globs, tilde e linee di storia. ! Neat
wjandrea,

1

Invece di eseguire il sourcing di bashrc, crea un altro file, che contiene solo la variabile.

  1. Crealo:

    echo "PS1='$PS1'" > /tmp/PS1
    • Nota: se la variabile contiene virgolette singole, sarà necessario utilizzare un comando che può sfuggirle, ad esempio:

      declare -p PS1 | cut -d' ' -f3- > /tmp/PS1
  2. Aprilo in un editor, ad es nano /tmp/PS1.

    • Per evitare di correre nanoripetutamente, è possibile eseguirlo in un altro terminale / TTY o utilizzare un editor grafico.
  3. Apporta le modifiche e salva.

  4. Fonte:

    source /tmp/PS1
  5. Ripetere i passaggi 3 e 4 secondo necessità.


1

Zsh ha un builtin chiamato varedche ti permette di modificare una variabile in linea. Ho scritto la mia versione, originariamente pubblicata su Super User :

vared(){
    # Based on the zsh builtin of the same name.
    IFS= read -rei "${!1}" "$1"
}

Nota che questo ha alcune sottili differenze rispetto al builtin di Zsh, ad esempio:

  • Non si verifica un errore se la variabile non è impostata
  • Verifica la validità del nome della variabile prima di stamparne il valore (ad es. vared $)
  • Tronca le variabili multilinea.

Quindi per modificare la PS1, basta eseguire vared PS1.


Accettare questa risposta è ciò che uso più di tutti i giorni
wjandrea,
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.