Ho passato molto tempo a leggere su login e shell interattive e perché si dovrebbe o non si dovrebbe impostare lambiente variabili, funzioni di shell, ecc. nei vari file profile e bashrc. In questo post è stato detto che le cose specifiche di bash come le opzioni del prompt dovrebbero essere impostate in ~ / .bashrc. Questo mi ha portato a interrogarmi sulla variabile PS1. In tutti gli esempi che ho visto riguardo a questo, hanno qualcosa come export PS1=""
. Dovrebbe essere esportato nellambiente poiché ha significato solo per bash? Basta avere PS1=""
nel mio ~ / .bashrc produce leffetto desiderato per me, ma mi chiedo se mi manca qualcosa.
Risposta
È corretto: PS1
è significativo solo nelle istanze interattive di bash, quindi dovrebbe essere impostato in ~/.bashrc
e non deve essere esportato. PS1
ha significato anche in altre shell, ma ha un significato diverso, perché le espansioni dei prompt differiscono tra le shell. Infatti, anche tra istanze di bash, PS1
può avere significati diversi, poiché il significato dipende dalle opzioni della shell (almeno promptvars
).
Lesportazione di PS1
nellambiente da .profile
è un ritorno agli anni 70, quando cera solo una shell che lo usava (la Bourne shell) e non aveva un file di configurazione. Funziona ancora oggi se usi sempre la stessa shell e non la configuri mai diversamente. Ma tutte le shell moderne che non sono progettate esclusivamente per lo scripting (csh, ksh , bash, zsh,…) legge un file di configurazione quando viene avviato interattivamente (.cshrc
, .kshrc
, .bashrc
, .zshrc
,…), quindi il metodo degli anni 70 non è più necessario. Limpostazione di PS1
e altre impostazioni specifiche della shell in un file specifico della shell e non esportarlo nellambiente, evita di rompere le cose quando si utilizza una diversa configurazione della shell o una shell diversa o un terminale diverso che non è in grado di mostrare la tua solita fantasia di prompt. Limpostazione di PS1
in un file specifico della shell funziona sempre, mentre limpostazione in .profile
ed esportarlo funziona solo in casi “semplici”, quindi non cè motivo per non farlo nel modo giusto, ma ci sono molti cattivi tutorial sul web e persino cattive configurazioni predefinite nelle distribuzioni. C “est la vie .
Commenti
- Come funziona lesportazione
PS1
da.profile
funziona per le shell bash non di accesso poiché non ' la fonte? Stai dicendo che funzionerebbe perché il non- la shell di login verrebbe biforcuta da una shell di login, quindi erediterebbePS1
attraverso lambiente? - @MikeSweeney sì, quella ' è il motivo per cui ' è esportato .
- Un modo in cui si diffonde lidea sbagliata sullesportazione di PS1 è vedere
if [ -n "$PS1" ] ; then proceed assuming an INTERACTIVE shell ; fi
– che comunemente appare nei file ' s .bashrc per caricare solo cose come il completamento del comando se questo è un utente ' s shell del terminale interattivo. Quindi, vedendolo funzionare lì, la stessa logica finisce negli script della shell, quindi " necessita di " per esportarlo. INVECE dovremmo controllare utenti terattivi / terminali contty -s
otest -t 0
. - @DouglasDD Indeed. Il test
PS1
è stato in Debian ' s/etc/profile
da secoli, ad esempio. Non ' non so dove sia nata questa cattiva pratica. Sospetto che provenga da un caso duso particolare (forse rilevamento di accessi rlogin o ssh?) In cui è capitato di funzionare. Purtroppo non riesce in molti altri casi, da qui le molte domande su questo argomento qui e altrove. - @Gilles non dovremmo esportare
CLICOLOR
eLS_COLORS
? @DouglasDD significa che ilif [[-z $p1]];then return fi
controllo nel mio.bashrc
è difettoso?