Jag tillbringade bara mycket tid på att läsa in på inloggnings- och interaktiva skal och varför man bör eller inte bör ställa in miljö variabler, skalfunktioner etc. i de olika profil- och bashrc-filerna. I detta inlägg nämndes det att bash-specifika saker som snabbalternativ skulle ställas in i ~ / .bashrc. Det fick mig att undra på PS1-variabeln. I alla exemplen jag har sett angående detta har de något som export PS1=""
. Borde detta verkligen exporteras till miljön eftersom det bara har betydelse för bash? Bara att ha PS1=""
i min ~ / .bashrc ger den avsedda effekten för mig, men jag undrar om jag saknar något.
Svar
Det är korrekt: PS1
är endast meningsfullt i interaktiva fall av bash, så det bör ställas in i ~/.bashrc
och bör inte exporteras. PS1
är också meningsfullt i andra skal, men det har en annan betydelse, eftersom snabba utvidgningar skiljer sig åt mellan skalen. Faktum är att även mellan instanser av bash kan PS1
ha olika betydelser, eftersom betydelsen beror på skalalternativ (minst promptvars
).
Exportera PS1
till miljön från .profile
är en återgång till 1970-talet, då det bara fanns ett skal som använde det (Bourne-skalet) och det hade ingen konfigurationsfil. Det fungerar fortfarande idag om du alltid använder samma skal och aldrig konfigurerar det annorlunda. Men alla moderna skal som inte är designade enbart för skript (csh, ksh , bash, zsh, …) läs en konfigurationsfil när den startas interaktivt (.cshrc
, .kshrc
, .bashrc
, .zshrc
, …), så 1970-metoden är inte längre nödvändig. Att ställa in PS1
och andra skalspecifika inställningar i en skalspecifik fil och inte exportera den till miljön, undviker att bryta saker när du använder en annan skalkonfiguration eller ett annat skal eller en annan terminal som inte kan visa din vanliga snabba fantasi. Att ställa in PS1
i en skalspecifik fil fungerar hela tiden, medan inställningen av den i .profile
och exportera det fungerar bara i ”enkla” fall, så det finns ingen anledning att inte göra det på rätt sätt, men det finns gott om dåliga handledning på nätet och till och med dåliga standardkonfigurationer i distributioner. C ”est la vie .
Kommentarer
- Hur exporterar
PS1
från.profile
fungerar för bash-skal som inte är inloggade eftersom de inte skulle ' t källa till det? Säger du att detta skulle fungera eftersom den icke- inloggningsskalet skulle gafflas från ett inloggningsskal så skulle ärvaPS1
genom miljön? - @MikeSweeney ja, att ' s varför det ' s exporterades .
- Ett sätt som fel idé sprids om att exportera PS1 är att se
if [ -n "$PS1" ] ; then proceed assuming an INTERACTIVE shell ; fi
– som ofta förekommer hos människor ' s .bashrc-filer för att bara ladda saker som kommandofullständighet om detta är en användare ' s interaktiva terminalskal. Så när det fungerar där, så växer samma logik upp i skalskript, så " behöver " för att exportera den. I stället bör vi checka in teraktiva / terminalanvändare medtty -s
ellertest -t 0
. - @DouglasDD Faktiskt. Testet
PS1
har varit i Debian ' s/etc/profile
i åldrar, till exempel. Jag vet inte ' var den här dåliga praxis uppstod. Jag misstänker att det kom från ett särskilt användningsfall (kanske upptäckte rlogin eller ssh-inloggningar?) Där det råkade fungera. Tyvärr misslyckas det i många andra fall, därav de många frågorna om detta ämne här och på andra håll. - @Gilles ska vi inte exportera
CLICOLOR
ochLS_COLORS
antingen? @DouglasDD betyder det attif [[-z $p1]];then return fi
kontrollen i min.bashrc
är bristfällig?