Ik heb zojuist veel tijd besteed aan het lezen van login en interactieve shells en waarom je de omgeving wel of niet moet instellen variabelen, shell-functies, etc. in de verschillende profiel- en bashrc-bestanden. In dit bericht werd vermeld dat bash-specifieke zaken zoals promptopties in ~ / .bashrc zouden moeten worden ingesteld. Dat deed me afvragen wat de PS1-variabele is. In alle voorbeelden die ik hierover heb “gezien, hebben ze zoiets als export PS1=""
. Moet dit echt naar de omgeving worden geëxporteerd omdat het alleen betekenis heeft voor bash? Gewoon PS1=""
in mijn ~ / .bashrc produceert het beoogde effect voor mij, maar ik” vraag me af of ik “iets mis.
Antwoord
Dat “is correct: PS1
heeft alleen betekenis in interactieve instanties van bash, dus het moet worden ingesteld in ~/.bashrc
en mag niet worden geëxporteerd. PS1
is ook zinvol in andere shells, maar het heeft een andere betekenis, omdat promptuitbreidingen verschillen tussen shells. In feite kan zelfs tussen de instances van bash, PS1
verschillende betekenissen hebben, aangezien de betekenis afhangt van shell-opties (tenminste promptvars
).
Het exporteren van PS1
naar de omgeving van .profile
is een terugkeer naar de jaren 70, toen er maar één shell was die gebruikte het (de Bourne-shell) en het had geen configuratiebestand. Het werkt nog steeds als je altijd dezelfde shell gebruikt en het nooit anders configureert. Maar alle moderne shells die niet puur zijn ontworpen voor scripting (csh, ksh , bash, zsh, …) een configuratiebestand lezen wanneer het interactief gestart is (.cshrc
, .kshrc
, .bashrc
, .zshrc
,…), dus de methode uit de jaren 70 is niet langer nodig. Door PS1
en andere shell-specifieke instellingen in een shell-specifiek bestand in te stellen, en het niet naar de omgeving te exporteren, wordt voorkomen dat dingen kapot gaan wanneer je een andere shell-configuratie of een andere shell of een een andere terminal die niet in staat is om uw gebruikelijke prompts te laten zien. Het instellen van PS1
in een shell-specifiek bestand werkt altijd, terwijl het instellen in .profile
en het exporteren ervan werkt alleen in “simpele” gevallen, dus er is geen reden om het niet op de juiste manier te doen, maar er zijn genoeg slechte tutorials op het web en zelfs slechte standaardconfiguraties in distributies. C “est la vie .
Reacties
- Hoe exporteert
PS1
van.profile
werken voor bash-shells die niet zijn aangemeld, aangezien ze het niet ' zouden kunnen vinden? Wil je zeggen dat dit zou werken omdat de login shell zou worden gevorkt vanuit een login shell dus zouPS1
erven via de omgeving? - @MikeSweeney ja, dat ' s waarom het ' s geëxporteerd .
- Een manier waarop het verkeerde idee zich verspreidt over het exporteren van PS1 is door
if [ -n "$PS1" ] ; then proceed assuming an INTERACTIVE shell ; fi
– dat vaak voorkomt in ' .bashrc-bestanden van mensen om alleen zaken als het aanvullen van opdrachten te laden als dit een gebruiker is ' s interactieve terminalshell. Dus als je ziet dat het daar werkt, komt dezelfde logica terecht in shellscripts, vandaar dat de " om het te exporteren. IN PLAATS moeten we inchecken teractieve / terminalgebruikers mettty -s
oftest -t 0
. - @DouglasDD inderdaad. De
PS1
-test is bijvoorbeeld al eeuwen in Debian ' s/etc/profile
. Ik weet niet ' waar deze slechte praktijk is ontstaan. Ik vermoed dat het afkomstig was van een bepaald gebruik (misschien rlogin- of ssh-logins detecteren?) Waar het toevallig werkte. Helaas mislukt het in veel andere gevallen, vandaar de vele vragen over dit onderwerp hier en elders. - @Gilles moeten we
CLICOLOR
en ook? @DouglasDD betekent dat dat deif [[-z $p1]];then return fi
controle in mijn.bashrc
gebrekkig is?