Migliore risposta
Grazie per A2A.
Credo che Anmol Vishwakarma abbia fornito uneccellente descrizione del importa.
Solo per essere sicuri di mettere le cose in prospettiva:
- / etc / profile, ~ / .bash\_rc , e ~ / .bash\_profile, sono tutti file e sono chiamati c script di configurazione. Possono contenere dichiarazioni di variabili, esportazione di variabili, comandi da eseguire allaccesso come il controllo della posta o delle notizie, limpostazione di umask, tra gli altri. Le cose tipiche che fanno gli utenti sono: aggiungere una directory a $ PATH, esportare qualche variabile, cambiare $ PS1, impostare i colori di visualizzazione, aggiungere un messaggio di testo di saluto, ecc.
- Tutti quei file, tranne / etc / profile, sono nascosti per impostazione predefinita, come indicato dal punto iniziale (quindi non è bash\_profile ma in realtà .bash\_profile ).
- Quando effettui il login (sia in locale che in remoto), questa è chiamata shell di login e viene trattata un po un po diverso dalla normale invocazione della shell. In tal caso, viene eseguito il file / etc / profile , se presente, dopodiché viene eseguito un ~ /.bash\_profile o un file ~ / .bashrc viene eseguito, in questordine.
- Per una shell interattiva, cioè quello con cui puoi interagire, perché stdin e stderr della shell sono entrambi TTY, il file ~ / .bash\_profile non viene eseguito, ma ~ / .bashrc lo è.
- Per una shell non interattiva, cioè quella con uno o entrambi stdin / stderr non è un TTY, non viene eseguito nessuno script di configurazione .
- In una shell di login, al logout, viene eseguito un file ~ / .bash\_logout , se presente.
- Secondo POSIX, stderr (e non stdout ) è il flusso che determina se una shell è interattiva. Se stderr viene reindirizzato, non è una shell interattiva, a meno che non sia specificato -i in linvocazione della shell. stdout non ha lo stesso effetto.
Risposta
Questa è solo la mia opinione, ma se exit
nel contesto di una funzione di shell (che chiude lattuale processo di shell) era uguale a return
(che restituisce funzione corrente), quindi non è possibile scrivere codice in una funzione della shell che chiude lo script corrente quando viene rilevata una condizione fatale dal codice nel corpo della funzione. Pensa alle chiamate al runtime assert()
(o equivalenti) in linguaggi di programmazione più strutturati.
Tutto quello che potresti fare invece è restituire un codice di errore al chiamante.
Vero, uscire bruscamente per errori fatali non è sicuramente il miglior stile di programmazione (libsvn
di Subversion una volta aveva una pessima reputazione a causa di questo: errori fatali rilevati nel il codice della libreria ha fatto sì che il programma lo usasse si interrompe bruscamente senza dare alcuna possibilità al codice chiamante di avvisare lutente o di provare a recuperare dallerrore).
Tuttavia, essere in grado di uscire bruscamente quando rileva errori fatali è abbastanza pratico nello sviluppo di soluzioni che funzionino nelle condizioni previste – e la programmazione della shell (e quindi anche la programmazione GNU Bash) ha sempre riguardato la fornitura di brevi soluzioni pratiche per i casi comuni e non soluzioni complesse gestendo attentamente ogni possibile specia l caso (ci sono molti altri strumenti / linguaggi per questo, che si tratti di C, Tcl, Perl, Python o persino PowerShell).
Nota anche che la probabile ragione per cui qualcuno sta usando gli script della shell Bourne in il primo posto invece di usare gli strumenti / linguaggi sopra menzionati è perché usando il primo è abbastanza più facile mettere insieme qualcosa che funzioni effettivamente utile che usare il secondo – il presupposto una volta era che lo scripting della shell permettesse agli utenti di usare quasi la stessa sintassi e strumenti che utilizzavano in modo interattivo ogni giorno, quindi qualcosa con cui avevano già familiarità.
Hai chiesto: Il comando return incorporato in bash è per le funzioni di shell, ma perché il comando “exit” non è sufficiente per le funzioni di shell?