Beste Antwort
Vielen Dank für A2A.
Ich glaube, Anmol Vishwakarma hat eine hervorragende Beschreibung des wichtig.
Nur um sicherzugehen, dass wir die Dinge relativieren:
- / etc / profile, ~ / .bash\_rc , und ~ / .bash\_profile, sind alle Dateien und heißen c Konfigurationsskripte. Sie können unter anderem Variablendeklarationen, Exportvariablen und Befehle enthalten, die beim Anmelden ausgeführt werden sollen, z. B. E-Mail- oder Nachrichtenprüfung, Festlegen von umask. Typische Dinge, die Benutzer tun, sind: Hinzufügen eines Verzeichnisses zu $ PATH, Exportieren einer Variablen, Ändern von $ PS1, Festlegen der Anzeigefarben, Hinzufügen einer Begrüßungstextnachricht usw.
- Alle diese Dateien mit Ausnahme von / etc / profile, sind standardmäßig ausgeblendet, wie durch den führenden Punkt angegeben (also nicht bash\_profile , sondern tatsächlich .bash\_profile ).
- Wenn Sie sich (entweder lokal oder remote) anmelden, wird dies als Anmeldeshell bezeichnet und ein wenig behandelt etwas anders als beim normalen Shell-Aufruf. In diesem Fall wird die Datei / etc / profile , falls vorhanden, ausgeführt. Danach wird entweder eine ~ /.bash\_profile oder eine ~ / .bashrc -Datei wird in dieser Reihenfolge ausgeführt.
- Für eine interaktive Shell, d. h die, mit der Sie interagieren können, da die stdin und stderr beide TTYs, die Datei ~ / .bash\_profile wird nicht ausgeführt, aber die Datei ~ / .bashrc ist.
- Für eine nicht interaktive Shell, dh die mit einem oder beiden stdin / stderr ist kein TTY, wird kein Konfigurationsskript ausgeführt .
- In einer Anmeldeshell wird beim Abmelden eine ~ / .bash\_logout -Datei ausgeführt, falls vorhanden.
- Gemäß POSIX stderr (und nicht stdout ) ist der Stream, der bestimmt, ob eine Shell interaktiv ist. Wenn stderr umgeleitet wird, handelt es sich nicht um eine interaktive Shell, es sei denn, -i ist in angegeben der Shell-Aufruf. stdout hat nicht den gleichen Effekt.
Antwort
Das ist nur meine Meinung, aber if exit
im Kontext einer Shell-Funktion (die den aktuellen Shell-Prozess beendet) war dasselbe wie eine return
(die von der zurückkehrt) aktuelle Funktion), dann konnten Sie keinen Code in eine Shell-Funktion schreiben, die das aktuelle Skript beendet, wenn der Code im Funktionskörper einen schwerwiegenden Zustand erkennt. Denken Sie an Aufrufe zur Laufzeit assert()
(oder Äquivalente) in strukturierteren Programmiersprachen.
Sie können stattdessen nur einen Fehlercode an den Aufrufer zurückgeben.
Richtig, das plötzliche Beenden schwerwiegender Fehler ist definitiv nicht der beste Programmierstil (Subversions libsvn
hatte aus diesem Grund einmal einen sehr schlechten Ruf: schwerwiegende Fehler in der Der Code der Bibliothek führte dazu, dass das Programm, das es verwendete, abrupt beendet wurde und dem aufrufenden Code keine Chance gab, den Benutzer zu benachrichtigen oder zu versuchen, den Fehler zu beheben.
Trotzdem ist es möglich, abrupt zu beenden, wenn schwerwiegende Fehler erkannt werden praktisch bei der Entwicklung von Lösungen, die unter den erwarteten Bedingungen funktionieren – und bei der Shell-Programmierung (und damit auch bei der GNU Bash-Programmierung) ging es immer darum, kurze praktische Lösungen für die häufigsten Fälle und nicht komplexe Lösungen, die sorgfältig mit allen möglichen Spezifikationen umgehen l Fall (es gibt viele andere Tools / Sprachen dafür, sei es C, Tcl, Perl, Python oder sogar PowerShell).
Beachten Sie auch, dass der wahrscheinliche Grund, warum jemand Bourne-Shell-Skripte verwendet Der erste Ort, anstatt die oben genannten Tools / Sprachen zu verwenden, ist, dass es mit den ersteren einfacher ist, etwas zusammenzustellen, das tatsächlich nützliche Arbeit leistet, als mit den letzteren – die Annahme war einmal, dass Shell-Scripting es Benutzern ermöglichte, fast dieselbe Syntax und zu verwenden Tools, die sie jeden Tag interaktiv verwendeten, daher etwas, mit dem sie bereits vertraut waren.
Sie haben gefragt: Der in bash integrierte Befehl return ist für Die Shell funktioniert, aber warum reicht der Befehl exit nicht für Shell-Funktionen aus?