Tocmai am petrecut mult timp citind despre login și shell-uri interactive și de ce ar trebui sau nu să setezi mediul variabile, funcții shell etc. în diversele profiluri și fișiere bashrc. În această postare s-a menționat că elementele specifice bash, cum ar fi opțiunile de promptare, ar trebui să fie setate în ~ / .bashrc. Asta m-a determinat să mă întreb despre variabila PS1. În toate exemplele pe care le-am văzut cu privire la acest lucru au ceva de genul export PS1="". Ar trebui să fie exportat într-adevăr în mediu, deoarece are doar semnificație pentru bash? Doar având PS1="" în ~ / .bashrc îmi produce efectul dorit, dar mă întreb dacă îmi lipsește ceva.

Răspunde

Acest lucru este corect: PS1 este semnificativ numai în instanțele interactive de bash, deci ar trebui setat în ~/.bashrc și nu ar trebui exportat. PS1 este semnificativ și în alte cochilii, dar are un sens diferit, deoarece expansiunile prompte diferă între cochilii. De fapt, chiar și între instanțele de bash, PS1 poate avea semnificații diferite, deoarece sensul depinde de opțiunile shell (cel puțin promptvars).

Exportul PS1 în mediu din .profile este o revenire în anii 1970, când exista o singură coajă care l-a folosit (shell-ul Bourne) și nu avea un fișier de configurare. Funcționează și astăzi dacă folosiți întotdeauna același shell și nu îl configurați niciodată diferit. Dar toate shell-urile moderne care nu sunt concepute exclusiv pentru scriptare (csh, ksh , bash, zsh, …) citiți un fișier de configurare când a fost pornit interactiv (.cshrc, .kshrc, .bashrc, .zshrc, …), deci metoda anilor 1970 nu mai este necesară. Setarea PS1 și alte setări specifice shell-ului într-un fișier specific shell-ului și nu exportarea acestuia în mediu, evită spargerea lucrurilor atunci când utilizați o altă configurație shell sau un shell diferit sau un terminal diferit care nu este capabil să vă arate imaginea obișnuită. Setarea PS1 într-un fișier specific shell funcționează tot timpul, în timp ce setarea acestuia în .profile și exportul funcționează numai în cazuri „simple”, deci nu există niciun motiv să nu o faceți corect, dar există o mulțime de tutoriale proaste pe web și chiar configurații implicite defecte în distribuții. C „est la vie .

Comentarii

  • Cum se exportă PS1 din .profile funcționează pentru shell-urile bash care nu sunt conectate, deoarece nu le vor ' sursa? Spuneți că acest lucru ar funcționa deoarece shell-ul de conectare ar fi furcat dintr-un shell de conectare, astfel încât să moștenească PS1 prin mediu?
  • @MikeSweeney da, că ' s de ce ' s exportă .
  • O modalitate prin care se răspândește ideea greșită despre exportul PS1 este de a vedea if [ -n "$PS1" ] ; then proceed assuming an INTERACTIVE shell ; fi – care apare în mod obișnuit în fișierele .bashrc ale oamenilor ' pentru a încărca lucruri cum ar fi finalizarea comenzilor numai dacă acesta este un utilizator ' s shell interactiv de terminal. Deci, văzând că funcționează acolo, aceeași logică se încheie în scripturile shell, de aceea " are nevoie de " pentru a-l exporta. ÎN schimb, ar trebui să ne verificăm utilizatori teractivi / terminali cu tty -s sau test -t 0.
  • @DouglasDD Într-adevăr. Testul PS1 a fost în Debian ' s /etc/profile de vârste, de exemplu. Nu ' nu știu unde a apărut această rea practică. Bănuiesc că a venit dintr-un caz de utilizare anume (poate detectarea logării rlogin sau ssh?) În care sa întâmplat să funcționeze. Din păcate, eșuează în multe alte cazuri, de aici numeroasele întrebări pe această temă aici și în altă parte.
  • @Gilles nu ar trebui să exportăm CLICOLOR și LS_COLORS fie? @DouglasDD înseamnă că verificarea if [[-z $p1]];then return fi din .bashrc este eronată?

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *