Bash esegue solo ~ / .profile ma nessuno dei ~ / .bash_profile e ~ / .bashrc

0

Ho uno strano problema con bash:

Commuto la mia shell predefinita in /bin/sh da zsh e non esegue ~/.bash_profile o ~/.bashrc quando apro un nuovo terminale, esegue solo ~/.profile .

Quale potrebbe essere il problema?

Probabilmente potrei ricavare ~/.bashrc da ~/.profile ma ciò non sembra una buona idea, ad es. si spezzerebbe se cambiassi nuovamente in un'altra shell.

    
posta iosdude 26.10.2016 - 12:36
fonte

3 risposte

2

Ti suggerisco di leggere il bash manuale sotto l'intestazione INVOCATION che indica:

   If bash is invoked with the name sh, it tries to mimic the startup behavior of historical versions of sh as  closely
   as  possible, while conforming to the POSIX standard as well.  When invoked as an interactive login shell, or a non-
   interactive shell with the --login option, it first attempts to read and  execute  commands  from  /etc/profile  and
   ~/.profile,  in that order.  The --noprofile option may be used to inhibit this behavior.  When invoked as an inter-
   active shell with the name sh, bash looks for the variable ENV, expands its value if it is  defined,  and  uses  the
   expanded  value as the name of a file to read and execute.  Since a shell invoked as sh does not attempt to read and
   execute commands from any other startup files, the --rcfile option has no effect.  A non-interactive  shell  invoked
   with the name sh does not attempt to read any other startup files.  When invoked as sh, bash enters posix mode after
   the startup files are read.

Una nuova sessione di terminale in OS X / macOS inizia sempre come shell di login.

    
risposta data 26.10.2016 - 14:10
fonte
0

Per ottenere /bin/sh per eseguire ~/.bashrc allo stesso modo di /bin/bash , dovresti fare quanto segue.

  1. Aggiungi le seguenti righe a ~/.profile .

    LOGINSHELL=YES
    export ENV=~/.shrc
    
  2. Crea il file ~/.shrc contenente la seguente riga.

    if [ "$LOGINSHELL" != "YES" ]; then  source ~/.bashrc; fi
    

Per facilitare il debug, di solito aggiungo la seguente riga all'inizio del file ~/.profile .

export DEBUGSHELL=YES

Questa riga può essere commentata quando si esegue il debug, come mostrato sotto.

#export DEBUGSHELL=YES

Successivamente, aggiungi le istruzioni condizionali echo all'inizio e alla fine dei file come ~/.profile , ~/.bashrc , ~/.shrc e altri. Ad esempio, ~/.shrc conterrà quanto segue.

if [ "$DEBUGSHELL" = "YES" ]; then echo entered .shrc; fi
if [ "$LOGINSHELL" != "YES" ]; then  source ~/.bashrc; fi
if [ "$DEBUGSHELL" = "YES" ]; then echo exited .shrc; fi

Un'altra idea, che può essere utile, è creare un file ~/.bashcm per contenere i comandi che devono essere eseguiti per entrambe le shell di login e interattive. Ad esempio, questo di solito è dove metto i miei comandi alias . Dovrai inoltre includere la seguente riga in entrambi i file ~/.profile e ~/.bashrc .

source ~/.bashcm
    
risposta data 26.10.2016 - 16:32
fonte
-1

/bin/sh non è bash . È Bourne Shell. La posizione di Bash (Bourne Again Shell) è /bin/bash . Cambia la shell predefinita in bash per utilizzare ~/.bash_profile anziché ~/.profile

    
risposta data 26.10.2016 - 13:03
fonte

Leggi altre domande sui tag