Bedste svar
Tak for A2A.
Jeg tror, Anmol Vishwakarma har givet en fremragende beskrivelse af noget.
Bare for at sikre, at vi sætter tingene i perspektiv:
- / etc / profile, ~ / .bash\_rc , og ~ / .bash\_profile, er alle filer og kaldes c onfiguration-scripts. De kan indeholde variable erklæringer, eksportvariabler, kommandoer, der skal udføres ved login som e-mail eller nyhedskontrol, indstilling af umask, blandt andre. Typiske ting, som brugere gør, er: tilføje nogle dir til $ PATH, eksportere nogle variabler, ændre $ PS1, indstille skærmfarver, tilføje en hilsen-tekstbesked osv.
- Alle disse filer undtagen / etc / profile, er som standard skjult som angivet med den førende prik (så det er ikke bash\_profile men faktisk .bash\_profile ).
- Når du logger ind (enten lokalt eller eksternt), kaldes dette en login-shell og behandles lidt lidt forskellig fra normal shellopkald. I så fald udføres / etc / profile -filen, hvis den er til stede, hvorefter enten en ~ /.bash\_profile eller en ~ / .bashrc -fil udføres i den rækkefølge.
- For en interaktiv skal, dvs. den, du kan interagere med, fordi shellens stdin og stderr er begge TTYer, ~ / .bash\_profile filen udføres ikke, men ~ / .bashrc er.
- For en ikke-interaktiv skal, dvs. den ene med en eller begge stdin / stderr ikke er en TTY, udføres der ikke noget konfigurationsscript .
- I en login shell, ved logout, udføres en ~ / .bash\_logout fil, hvis den findes.
- Som i POSIX, stderr (og ikke stdout ) er den strøm, der bestemmer, om en skal er interaktiv. Hvis stderr omdirigeres, er det ikke en interaktiv shell, medmindre -i er angivet i shell påkaldelse. stdout har ikke den samme effekt.
Svar
Det er bare min mening, men hvis exit
i forbindelse med en shell-funktion (som afslutter den aktuelle shell-proces) var den samme som en return
(som vender tilbage fra nuværende funktion), så kunne du ikke skrive kode i en shell-funktion, der afslutter det aktuelle script, når en dødelig tilstand opdages af koden i funktionens krop. Tænk på opkald til runtime assert()
(eller ækvivalenter) på mere strukturerede programmeringssprog.
Alt du kan gøre i stedet for er at returnere en fejlkode til den, der ringer op.
Det er sandt, at pludselig afslutte på fatale fejl er bestemt ikke den bedste programmeringsstil (Subversions libsvn
havde engang et meget dårligt ry på grund af dette: fatale fejl opdaget i bibliotekets kode resulterede i, at programmet brugte det brat afslutter, hvilket ikke gav opkaldskoden nogen chance for at underrette brugeren eller forsøge at komme sig fra fejlen).
Ikke desto mindre er det i stand til brat at kunne afslutte, når detektering af fatale fejl er ganske praktisk til udvikling af løsninger, der fungerer under de forventede forhold – og shell-programmering (og dermed også GNU Bash-programmering) har altid handlet om at levere korte praktiske løsninger til almindelige sager og ikke komplekse løsninger, der omhyggeligt håndterer alle mulige specia l tilfælde (der er masser af andre værktøjer / sprog til det, det være sig C, Tcl, Perl, Python eller endda PowerShell).
Bemærk også, at den sandsynlige årsag til, at nogen bruger Bourne shell-scripts i det første sted i stedet for at bruge de ovennævnte værktøjer / sprog er, at brugen af førstnævnte er ret lettere at sammensætte noget, der faktisk fungerer nyttigt end at bruge sidstnævnte – antagelsen var engang, at shell-scripting tillod brugere at bruge næsten den samme syntaks og værktøjer, som de brugte interaktivt hver dag, og dermed noget, de allerede var fortrolige med.
Du spurgte: Den indbyggede return kommando i bash er til shell-funktionerne, men hvorfor er kommandoen exit ikke tilstrækkelig til shell-funktioner?