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 erediterebbe PS1 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 con tty -s o test -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 e LS_COLORS? @DouglasDD significa che il if [[-z $p1]];then return fi controllo nel mio .bashrc è difettoso?

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *