executa o script bash dentro de .bashrc

7

Oi eu estou curioso para saber se é possível executar um script bash dentro do bash rc. Parece criar um loop infinito, a menos que houvesse alguma maneira de dizer para não tentar iniciar um novo shell.

Aqui está um exemplo

bash_script.sh:

#!/bin/bash
echo Hello World

.bashrc

export HELLO_WORLD=$(bash_script.sh)    
    
por Plazgoth 07.12.2012 / 23:58

4 respostas

3

Um script é executado por um shell não interativo, enquanto .bashrc é automaticamente originado apenas por shells interativos.

Existe uma maneira de acionar um loop infinito, no entanto. Todo bash shell, interativo ou não, verifica se a variável BASH_ENV está configurada e, em caso afirmativo, usa seu valor como o nome de um arquivo para a origem. Nesse caso, a execução de um script bash desse arquivo resultaria no loop infinito, portanto, devem ser executados. Na prática, porém, esse script (como o nome sugere) seria usado simplesmente para definir variáveis de ambiente para uso pelo shell, e não executar código arbitrário.

    
por 11.05.2014 / 04:33
2

Ok, descobri como fazer isso. Em .bashrc apenas faça:

export HELLO_WORLD=$(source bash_script.sh)
    
por 08.12.2012 / 00:14
2

Você não precisa fazer nada. Simplesmente iniciar um script bash não fará com que seu .bashrc seja invocado.

A única vez que seu .bashrc será invocado é se o bash for interativo. Quando você inicia um script, esse script não é interativo.

Na página do bash man:

An interactive shell is one started without non-option arguments and without the -c option whose standard input and error are both connected to terminals (as deter‐ mined by isatty(3)), or one started with the -i option. PS1 is set and $- includes i if bash is interactive, allowing a shell script or a startup file to test this state.

O bit importante aqui é "iniciado sem argumentos não-opcionais". Quando você inicia um script, o primeiro argumento para bash é o caminho para esse script. Assim, ele tem um argumento não opcional e não é interativo.

    
por 11.05.2014 / 04:29
1

Coloque isso como a linha 1:

[ -z "$PS1" ] && return # If not interactive, exit
    
por 11.05.2014 / 04:05

Tags