Jeg brugte bare meget tid på at læse på login og interaktive skaller, og hvorfor man skulle eller ikke skulle indstille miljø variabler, shell-funktioner osv. i de forskellige profil- og bashrc-filer. I dette indlæg blev det nævnt, at bash-specifikke ting som hurtigindstillinger skulle indstilles i ~ / .bashrc. Det fik mig til at undre mig over PS1-variablen. I alle de eksempler, jeg har set angående dette, har de noget som export PS1=""
. Skal dette virkelig eksporteres til miljøet, da det kun har betydning for bash? Bare at have PS1=""
i min ~ / .bashrc producerer den tilsigtede effekt for mig, men jeg spekulerer på, om jeg mangler noget.
Svar
Det er korrekt: PS1
er kun meningsfuldt i interaktive forekomster af bash, så det skal indstilles i ~/.bashrc
og bør ikke eksporteres. PS1
er også meningsfuld i andre skaller, men det har en anden betydning, fordi hurtige udvidelser adskiller sig mellem skaller. Faktisk, selv mellem forekomster af bash, kan PS1
have forskellige betydninger, da betydningen afhænger af shell-indstillinger (mindst promptvars
).
Eksport af PS1
til miljøet fra .profile
er et tilbagevenden til 1970erne, da der kun var en skal, der brugte den (Bourne-skallen), og den havde ikke en konfigurationsfil. Den fungerer stadig i dag, hvis du altid bruger den samme skal og aldrig konfigurerer den anderledes. Men alle moderne skaller, der ikke er designet udelukkende til scripting (csh, ksh , bash, zsh, …) læs en konfigurationsfil, når den startes interaktivt (.cshrc
, .kshrc
, .bashrc
, .zshrc
,…), så 1970-metoden er ikke længere nødvendig. Indstilling af PS1
og andre shell-specifikke indstillinger i en shell-specifik fil og ikke eksporteres til miljøet, undgår at bryde ting, når du bruger en anden shell-konfiguration eller en anden shell eller en en anden terminal, der ikke er i stand til at vise din sædvanlige hurtige fanciness. Indstilling af PS1
i en shell-specifik fil fungerer hele tiden, mens indstilling af den i .profile
og eksport af det fungerer kun i “enkle” tilfælde, så der er ingen grund til ikke at gøre det på den rigtige måde, men der er masser af dårlige tutorials på nettet og endda dårlige standardkonfigurationer i distributioner. C “est la vie .
Kommentarer
- Hvordan eksporterer
PS1
fra.profile
arbejder for bash-skaller, der ikke er logget ind, da de ikke ville ' t kilde det? Siger du, at dette ville fungere, fordi den ikke- login shell ville blive forked fra en login shell, så ville arvePS1
gennem miljøet? - @MikeSweeney ja, at ' s hvorfor det ' s eksporteres .
- En måde, som den forkerte idé spreder om eksport af PS1, er at se
if [ -n "$PS1" ] ; then proceed assuming an INTERACTIVE shell ; fi
– som ofte vises hos mennesker ' s .bashrc-filer for kun at indlæse ting som kommandofuldførelse, hvis dette er en bruger ' s interaktive terminalskal. Så når den ser det arbejde der, vinder den samme logik i shell-scripts, hvorfor " har brug for " for at eksportere det. I stedet for skal vi tjekke ind teraktive / terminalbrugere medtty -s
ellertest -t 0
. - @DouglasDD Faktisk. Testen
PS1
har været i Debian ' s/etc/profile
i årevis. Jeg ved ikke ' hvor denne dårlige praksis opstod. Jeg formoder, at det kom fra en bestemt brugssag (måske detektering af rlogin- eller ssh-login?), Hvor det tilfældigvis fungerede. Desværre mislykkes det i mange andre tilfælde, derfor de mange spørgsmål om dette emne her og andre steder. - @Gilles hvis vi ikke eksporterer
CLICOLOR
ogLS_COLORS
enten? @DouglasDD betyder det, atif [[-z $p1]];then return fi
afkrydsningsfeltet i min.bashrc
er mangelfuld?