Perché nessun shebang in .bashrc / .bash_profile?


22

Richiesta semplice: mi sono appena reso conto di non aver mai visto uno shebang sopra uno .bashrcscript, il che mi porta a pensare che il sistema usi la shell predefinita per procurarselo al login ( ${SHELL}). Sto riflettendo sui motivi per cui è così, vale a dire che è considerata una cattiva abitudine usare qualcosa di diverso dalla shell predefinita per eseguire lo script di accesso.


1
C'è un motivo per cui si chiama bash rc ...
Ajedi32

Risposte:


28

.bashrce NON.bash_profile sono script. Sono file di configurazione che vengono acquistati ogni volta che vengono eseguiti in due modi:bash

  • interattivo
  • accesso

La sezione INVOCATION della pagina man di bash è ciò che è rilevante.

Una shell di login è quella il cui primo carattere dell'argomento zero è a -, oppure uno è iniziato con l' --loginopzione.

Una shell interattiva è una avviata senza argomenti non opzionali e senza l' -copzione il cui input ed errore standard sono entrambi collegati ai terminali (come determinato da isatty(3)), o uno avviato con l' -i opzione. PS1 è impostato e $-include ise bashè interattivo, consentendo uno script shell o un file di avvio per testare questo stato.

I seguenti paragrafi descrivono come bashesegue i suoi file di avvio. Se uno dei file esiste ma non può essere letto, bash segnala un errore. Le tilde sono espanse nei nomi dei file come descritto di seguito in Tilde Expansion nella sezione EXPANSION .

Quando bash viene invocato come shell di login interattiva o come shell non interattiva con l' --loginopzione, legge innanzitutto ed esegue i comandi dal file /etc/profile, se quel file esiste. Dopo aver letto il file, si cerca ~/.bash_profile, ~/.bash_logine ~/.profile, in questo ordine, e legge ed esegue i comandi dal primo che esiste ed è leggibile. L' --noprofileopzione può essere utilizzata all'avvio della shell per inibire questo comportamento.

Quando esce una shell di login, bash legge ed esegue i comandi dal file ~/.bash_logout, se esiste.

Quando viene avviata una shell interattiva che non è una shell di accesso, bash legge ed esegue i comandi da ~/.bashrc, se quel file esiste. Questo può essere inibito usando l' --norcopzione. L' --rcfile file opzione costringerà bash a leggere ed eseguire comandi dal file anziché ~/.bashrc.

Puoi controllare quando vengono caricati tramite le opzioni della riga di comando --norce --noprofile. Puoi anche ignorare la posizione da cui vengono caricati usando l' --rcfileinterruttore.

Come altri hanno già detto, puoi imitare il modo in cui questi file vengono caricati attraverso l'uso del source <file>comando o l'uso del . <file>comando.

È meglio pensare a questa funzionalità come segue:

  1. bash si avvia con un ambiente spoglio
  2. bash quindi apre uno di questi file (a seconda di come è stato invocato come interattivo o di accesso, e quindi ...
  3. ... riga per riga esegue ciascuno dei comandi all'interno del file ...
  4. quando completo dà il controllo sotto forma di un prompt, in attesa di input

Metodi per invocare

Questo argomento sembra emergere di tanto in tanto, quindi ecco un piccolo cheat dei vari modi di invocare bashe cosa ne risulta. NOTA: Per aiutare ho aggiunto i messaggi "sourced $ HOME / .bashrc" e "sourced $ HOME / .bash_profile "nei rispettivi file.

chiamate di base

  1. bash -i

    $ bash -i
    sourced /home/saml/.bashrc
    
  2. bash -l

    $ bash -l
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    
  3. bash -il -or- bash -li

    $ bash -il
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    
  4. bash -c "..cmd .."

    $ bash -c 'echo hi'
    hi
    

    NOTA: Notare che lo -cswitch non ha generato entrambi i file!

disabilitando la lettura dei file di configurazione

  1. bash --norc

    $ bash --norc
    bash-4.1$ 
    
  2. bash :noprofile

    $ bash --noprofile
    sourced /home/saml/.bashrc
    
  3. bash --norc -i

    $ bash --norc -i
    bash-4.1$ 
  4. bash --norc -l

    $ bash --norc -l
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
  5. bash --noprofile -i

    $ bash --noprofile -i
    sourced /home/saml/.bashrc
  6. bash --noprofile -l

    $ bash --noprofile -l
    bash-4.1$ 
  7. bash --norc -i -or- bash --norc -l

    $ bash --norc -c 'echo hi'
    hi

Modi più esoterici per chiamare bash

  1. bash --rcfile $ HOME / .bashrc

    $ bash -rcfile ~/.bashrc 
    sourced /home/saml/.bashrc
  2. bash --norc --rcfile $ HOME / .bashrc

    $ bash --norc -rcfile ~/.bashrc 
    bash-4.1$ 

Questi fallirono

  1. bash -i -rcfile ~ / .bashrc

    $ bash -i -rcfile ~/.bashrc 
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    bash: /home/saml/.bashrc: restricted: cannot specify `/' in command names
  2. bash -i -rcfile .bashrc

    $ bash -i -rcfile .bashrc
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    bash: .bashrc: command not found

Probabilmente ce ne sono altri ma ottieni il punto, si spera ...

Cos'altro?

Infine, se sei così affascinato da questo argomento che ti piacerebbe leggere / esplorare di più su di esso, ti consiglio vivamente di dare un'occhiata alla Guida per principianti di Bash, in particolare la sezione: 1.2. Vantaggi del Bourne Again SHell . Le varie sottosezioni sotto quella, da "1.2.2.1. Invocazione" a "1.2.2.3.3. Comportamento interattivo della shell" spiegano le differenze di basso livello tra i vari modi in cui è possibile invocare bash.


@amphibient - mi dispiace che sia sfuggito di mano, speriamo che la gente apprezzerà il suo valore e non lo punirà con i voti negativi. Con questo qui possiamo ora fare riferimento in un'altra risposta lungo la strada. 8-). Stavo pensando di fare un tavolo per mostrarlo, ma sarebbe stato pazzesco Cool.
slm

Li hai effettivamente testati? Una volta ho provato a seguire quello che fa la mia bash in squeeze e non si è comportato del tutto come suggerito dal manuale
Bananguin,

@Bananguin - ognuno di quei comandi è stato eseguito da me e questo è l'output che è stato prodotto sotto i comandi. L'unica "cosa" potenziale con la mia configurazione potrebbe essere che la mia .bash_profileinclude una riga per il sorgente .bashrc. Ma credo che sia molto tipico delle configurazioni.
slm

Questo potrebbe essere soggettivo, ma non lo direi .bashrce .bash_profilenon sono script . IMHO sono script con scopi specifici che vengono generati in modo implicito durante l'inizializzazione di bash o esplicitamente quando è necessario applicare le loro modifiche. Non configurano semplicemente l'ambiente bash (variabili, funzioni, alias ...) come previsto dai file di configurazione. Possono fare qualsiasi azione come negli script comuni. Ad esempio, possono avviare varie azioni come attività in background, scrivere registri, inizializzare alcuni programmi, ecc. Grazie per il riepilogo dettagliato!
pabouk,

Questa risposta è persino migliore di qualsiasi risposta qui stackoverflow.com/questions/415403/… !
Jacob Tomlinson,

13

.bashrcgli script sono eseguiti solo da bashsoli. Non sono indipendenti e non sono destinati al execsistema. (In realtà, in genere non sono contrassegnati come eseguibili e, come dici tu, non hanno una linea shebang.)

Tali script sono pensati per essere sourced, dal momento che generalmente fanno cose come cambiare le variabili di ambiente ( $PATHad esempio), che dovrebbero persistere al termine dello script. Quindi sarebbe davvero inutile provare a eseguirne uno in una subshell.


5

Oltre alle altre risposte, tieni presente che se lo desideri, nulla ti impedisce di mettere un shebang all'inizio di questi file di configurazione.

Ciò non danneggerebbe la shell che li procurerà poiché lo shebang verrà elaborato come un normale commento, cioè ignorato.

Ciò potrebbe aiutare gli editor che utilizzano l'evidenziazione della sintassi per capire quale linguaggio di programmazione viene utilizzato nel file.

Si noti che alcuni editor come vimforniscono modi alternativi come modeline per quest'ultimo. cioè puoi sempre mettere le linee di modalità alla fine del ~/.bashrce in questo ~/.bash_profilemodo:

...
<code in ~/.bashrc>
...
# vim: ft=sh :

1
La risposta accettata da @slm sopra è ottima, ma questo è quello che stavo cercando, per quanto riguarda l'aggiunta di uno shebang all'inizio del mio .bash_profilesu una raccomandazione da ShellCheck.
Jlucktay,

1

Ho letto questo ovunque non so dove esattamente ma è vero

Il manuale di Bash è un po 'confuso in quest'area, ma Bash non esegue eXecute ~ / .bash_profile come uno script di shell. Legge il file e quindi esegue i comandi al suo interno (puoi fare qualcosa di simile eseguendo source ~ / .bash_profile).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.