.bashrc não exporta o caminho?

2

Sempre que faço login no cluster da minha empresa, primeiro recebo um ticket do Kerberos e, em seguida, tento enviar um trabalho, mas ele não consegue encontrar o spark-ubmit:

-bash-4.1$ ./pipeline.runtime/scripts/vpspark-submit.sh crow-env/ /user/gsamaras/crow_spm-1.0.2.3.tar.gz --properties-file $SPARK_CONF_PROPERTIES --num-executors 1 foo.py 
./pipeline.runtime/scripts/vpspark-submit.sh: line 51: spark-submit: command not found

Se, no entanto, eu fonte o .bashrc, ele funciona bem.

>> cat .bashrc
[ -f /etc/bashrc ] && . /etc/bashrc
export PATH=${SPARK_HOME}/bin:$PATH
export SPARK_CONF_DIR=~/tripodrt-spark/conf/
export SPARK_CONF_PROPERTIES=~/tripodrt-spark/conf/spark-overrides-tt.conf

Por quê? Eu esperaria que o .bashrc seja executado no login. Eu estou no Red Hat Enterprise Linux.

    
por gsamaras 02.08.2016 / 18:53

1 resposta

4

Do manual bash :

When an interactive shell that is not a login shell is started, bash reads and executes commands from ~/.bashrc, if that file exists.

Portanto, se seu shell for um shell de login, ~/.bashrc não será lido.

Eu colocaria adições em PATH em ~/.bash_profile , e / ou possivelmente fornecerei ~/.bashrc daí.

Algumas camadas fazem uma distinção entre dois ou três tipos de arquivos de inicialização:

  1. Um arquivo profile que é lido por shells de login.
  2. Um arquivo que é lido por shells interativos.
  3. E possivelmente, um arquivo que é lido por shells não interativos, ou seja, scripts.

Para bash :

  1. ~/.bash_profile
  2. ~/.bashrc
  3. Qualquer arquivo $BASH_ENV aponta para.

O ponto de separar o script de inicialização perfil do script lido por shells interativos é permitir que você faça (potencialmente pesadas) tarefas de configuração para todas as futuras sessões de shell de uma vez por todas. Isso geralmente envolve definir PATH no mínimo, mas também qualquer outra variável exportada (por exemplo, variáveis de ambiente).

O script de inicialização do shell interativo ( ~/.bashrc no caso de bash ) precisa apenas fazer algo especificamente necessário para shells interativos. Isso inclui a configuração de variáveis de shell como PS1 que não devem ser exportadas e a definição de aliases e funções, etc. Você também deve configurar variáveis de ambiente que precisam ser definidas para esta sessão e qualquer processo iniciado desta sessão, como GPG_TTY ( GPG_TTY="$(tty)" ) se você estiver usando o GnuPG.

Eu tenho a tendência de source $HOME/.bashrc do meu ~/.bash_profile após definir meu PATH e ajustar meu umask da maneira que eu quiser, e deixar ~/.bashrc configurar as variáveis do arquivo de histórico,%% prompt%, PS1 e PAGER e alguns aliases e funções e outros. (Isso é meio mentira; eu na verdade EDITOR o exec shell do meu perfil se eu puder encontrá-lo, mas se não puder, continuo com ksh93 ). Eu também renego meu shell no arquivo de inicialização do shell interativo (com bash ), porque eu geralmente trabalho em uma máquina compartilhada com muitas outras pessoas que precisam da CPU mais do que eu (mas isso é eu).

O shell renice -n 4 $$ usa

  1. ksh93
  2. ~/.profile (ou qualquer que seja o ~.kshrc aponta para)

$ENV é um pouco melhor do que ksh93 , pois sabe que existe um shell de login interativo, então lê bash (se estiver definido) para essas sessões de shell também, depois de ler $ENV .

O shell ~/.profile também lê pdksh para shells não interativos, o que me irrita (e quebra alguns scripts importantes que eu uso), então eu tenho

case $- in
    *i*)    ;;
    *)      return      ;;
esac

na parte superior do meu arquivo ~/.kshrc .

    
por 02.08.2016 / 19:17