Beste antwoord
Bedankt voor A2A.
Ik geloof dat Anmol Vishwakarma een uitstekende beschrijving heeft gegeven van de zaak.
Om er zeker van te zijn dat we de zaken in perspectief plaatsen:
- / etc / profile, ~ / .bash\_rc , en ~ / .bash\_profile, zijn allemaal bestanden en worden c configuratiescripts genoemd. Ze kunnen variabelenverklaringen, exportvariabelen, opdrachten die bij het inloggen moeten worden uitgevoerd, zoals e-mail of nieuwscontroles, onder andere het instellen van umask bevatten. Typische dingen die gebruikers doen zijn: een map toevoegen aan $ PATH, een variabele exporteren, $ PS1 wijzigen, weergavekleuren instellen, een begroetingstekst toevoegen, enz.
- Al die bestanden, behalve / etc / profile zijn standaard verborgen, zoals aangegeven door de punt vóór (het is dus niet bash\_profile maar eigenlijk .bash\_profile ).
- Wanneer u inlogt (lokaal of op afstand), wordt dit een login-shell genoemd en wordt een beetje behandeld beetje anders dan normale shell-aanroep. In dat geval wordt het / etc / profile bestand, indien aanwezig, uitgevoerd, waarna ofwel een ~ /.bash\_profile of een ~ / .bashrc -bestand wordt uitgevoerd, in die volgorde.
- Voor een interactieve shell, dwz degene waarmee je kunt communiceren, omdat de stdin en stderr beide TTYs het ~ / .bash\_profile -bestand wordt niet uitgevoerd, maar het ~ / .bashrc is.
- Voor een niet-interactieve shell, dwz degene met een of beide stdin / stderr is geen TTY, er wordt geen configuratiescript uitgevoerd .
- In een login-shell wordt bij het uitloggen een ~ / .bash\_logout -bestand, indien aanwezig, uitgevoerd.
- Volgens POSIX, stderr (en niet stdout ) is de stream die bepaalt of een shell interactief is. Als stderr wordt omgeleid, is het geen interactieve shell, tenzij -i is opgegeven in de shell-aanroep. stdout heeft niet hetzelfde effect.
Antwoord
Dat is gewoon mijn mening, maar if exit
in de context van een shell-functie (die het huidige shell-proces verlaat) hetzelfde was als een return
(die terugkeert van de huidige functie), dan kon je geen code schrijven in een shell-functie die het huidige script afsluit wanneer een fatale toestand wordt gedetecteerd door de code in de hoofdtekst van de functie. Denk aan aanroepen van runtime assert()
(of equivalenten) in meer gestructureerde programmeertalen.
Het enige wat je zou kunnen doen is een foutcode terugsturen naar de beller.
Het is waar, het abrupt afsluiten bij fatale fouten is zeker niet de beste programmeerstijl (Subversions libsvn
had ooit een zeer slechte reputatie hierdoor: fatale fouten gedetecteerd in de bibliotheekcode heeft ertoe geleid dat het programma dat het gebruikte abrupt stopte, waardoor de aanroepende code geen kans kreeg om de gebruiker op de hoogte te stellen of om te proberen de fout te herstellen).
Desalniettemin is abrupt kunnen afsluiten bij het detecteren van fatale fouten vrij praktisch bij het ontwikkelen van oplossingen die werken in de verwachte omstandigheden – en shell-programmering (en dus ook GNU Bash-programmering) is altijd geweest om korte praktische oplossingen voor de veelvoorkomende gevallen, en geen complexe oplossingen die zorgvuldig omgaan met alle mogelijke specia l case (er zijn genoeg andere tools / talen daarvoor, of het nu C, Tcl, Perl, Python of zelfs PowerShell is).
Merk ook op dat de waarschijnlijke reden waarom iemand Bourne shell scripts gebruikt in de eerste plaats in plaats van de bovengenoemde tools / talen te gebruiken, is omdat het gebruik van de eerste vrij gemakkelijker is om iets samen te stellen dat echt nuttig werk doet dan het laatste te gebruiken – de aanname was ooit dat shell-scripting gebruikers toestond om bijna dezelfde syntaxis te gebruiken en tools die ze elke dag interactief gebruikten, dus iets waar ze al bekend mee waren.
Je vroeg: Het ingebouwde return-commando in bash is voor de shell-functies, maar waarom is het “exit” -commando niet voldoende voor shell-functies?