Como fazer funções criadas em um script bash persistirem como aquelas em .bashrc?

4

Meu .bashrc estava ficando um pouco longo, então decidi dividi-lo em arquivos menores de acordo com o tópico e, em seguida, chamar esses arquivos de dentro .bashrc assim

#my long .bashrc file
bash .topic1rc
bash .topic2rc

mas, dentro de um desses sub-scripts, eu criei uma função bash. Infelizmente, não está mais disponível para mim, como era antes de eu quebrar tudo em pedaços. Como faço para quebrar meu arquivo .bashrc em pedaços, mas manter o acesso às variáveis e funções que eu crio?

    
por John Berryman 22.02.2011 / 04:30

4 respostas

9

Se eu entendi sua pergunta corretamente, você precisa source ou . dos seus arquivos. Por exemplo, dentro do seu .bashrc e cuidando da ordem (só você sabe):

source .topic1rc
source .topic2rc

source pode ser reduzido para . na linha de comando para facilidade de uso - é exatamente o mesmo comando. O efeito de source é efetivamente alinhar o script que é chamado.

    
por 22.02.2011 / 04:51
6

O que você está fazendo não funciona porque cada bash .topic1rc chama um novo bash shell como um processo filho, e não há como comunicar o ambiente, as variáveis do shell ou as funções de volta ao processo pai, o shell bash em que você está interessado.

O que você quer fazer é usar o comando . (também disponível como o mais detalhado source - qualquer um faz a mesma coisa). Isso lê o script fornecido no shell atual em vez de um novo shell. Então:

#my long .bashrc file
. ~/.topic1rc
. ~/.topic2rc

(Provavelmente funciona bem para quase todo o uso omitir o caminho, já que o principal ~/.bashrc é normalmente executado quando você efetua login e seu diretório pessoal é o seu diretório de trabalho inicial, mas é muito melhor descrevê-lo. )

    
por 22.02.2011 / 04:58
1

Como outros explicaram, você está executando esses scripts em um novo shell que morre depois de executar. Você precisa criar seus arquivos com

. .topic1rc

ou

source .topic1rc

Você também pode criar uma solução um pouco mais avançada que não exigirá que você edite seu .bashrc se você quiser adicionar mais pedaços no futuro.

Você pode colocar todos os seus arquivos de configuração em um diretório, digamos ~/.bash.d , e depois ter isso como o único conteúdo do seu arquivo .bashrc :

if [[ -d ~/.bash.d ]]
then
    for conf_file in ~/.bash.d/*
    do
        if [[ -f $conf_file ]]
        then
            source "$conf_file"
        fi
    done
fi

Dessa forma, todos os seus arquivos de configuração do bash em .bash.d são originados e você pode controlar a ordem em que isso acontece, pois eles serão originados em ordem alfabética do nome do arquivo.

    
por 22.02.2011 / 10:03
0

Observe que quando você usa os comandos source ou . , por padrão no bash, o argumento do arquivo será procurado no $PATH a menos que contenha um caractere / . Você quer tanto

source ./.topic1rc 

ou

shopt -u sourcepath
source .topic1rc
    
por 22.02.2011 / 16:37