fonte meu ~ / .bash_aliases de um script não em ~ /

6

Quero atualizar meus aliases de um script.

Eu tenho alguns novos aliases em ~/updateFiles/newAliases :

alias ga='git add -A'

Eu também tenho este script de atualização ~/updateFiles/updater :

#!/bin/bash
cp newAliases ~/.bash_aliases
source ~/.bash_aliases

Mas parece que não funciona. Como faço para obter o ambiente de chamada para source dos novos aliases?

Isso não funciona:

$ cd ~/updateFiles
$ ./updater
$ ga
-su: ga: command not found

Isso funciona:

$ cd ~/updateFiles
$ ./updater
$ source ~/.bash_aliases
$ ga
$
    
por hoosierEE 30.09.2014 / 20:54

3 respostas

8

A diferença é o escopo e sintaticamente é muito sutil:

$ ./updater

é o equivalente de

$ /bin/bash ./updater

Ele executa o script (se estiver marcado como executável e em um sistema de arquivos montado com a opção exec - o último formulário funciona mesmo se uma dessas condições não for atendida). Isso significa que ele gera uma nova instância de shell e alimenta o conteúdo do script. Assim, todos os aliases definidos nele são limitados à duração do shell de interpretação, que é somente até o final do script.

$ . updater
$ . ./updater
$ source updater
$ source ./updater

significa tudo a mesma coisa e diz ao shell current para executar o conteúdo desse arquivo como se você o tivesse digitado na linha de comando. Isso significa que quaisquer aliases, funções, variáveis de ambiente, configurações de opção do shell e assim por diante estarão disponíveis no shell posteriormente.

É também por isso que, às vezes, você vê arquivos init de shell ( ~/.bashrc no caso do Bash) que se parecem com isso:

#!/bin/bash
for n in ~/etc/bash/*; do
    . $n
done

em que ~/etc/bash pode se parecer:

~/etc/bash/
|-- bash.10.env
|-- bash.20.aliases
'-- bash.30.func

(os nomes são bastante autoexplicativos). Sempre que você adicionar alguns arquivos a esse diretório init, tudo o que você precisa fazer para aplicar as alterações é . ~/.bashrc . Para o qual você pode ter um alias, é claro. Isso também pode ser estendido - por exemplo, tendo uma inicialização especializada dependendo do hostname (ou fase da lua usando pom de bsg-games).

Uma grande ressalva para essas configurações: certifique-se de tornar os arquivos init "reentrantes", no sentido de que não importa quantas vezes você os usa em um shell - por exemplo variáveis que você queira preservar devem ser definido condicionalmente:

VAR=${VAR:-"value"}

em vez de incondicionalmente:

VAR="value"
    
por 30.09.2014 / 21:21
7

Você precisa criar o arquivo, caso contrário, os aliases terão uma duração muito curta: a duração do shell chamado.

Eu tenho isso no meu .bashrc :

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

para ler nos aliases. E este alias:

alias realias='source ~/.bash_aliases'

no início do meu arquivo .bash_aliases . Após uma atualização, apenas emito o comando realias .

    
por 30.09.2014 / 21:02
6

Eu não acho que você não possa fazer isso com um script . Para usar um script, você teria que obtê-lo, não executá-lo como os outros explicaram. Outra abordagem é usar uma função. Adicione estas linhas ao seu ~/.bashrc :

updater(){
    cp ~/newAliases ~/.bash_aliases
    source ~/.bash_aliases
}

Em seguida, execute updater e seus aliases serão renovados e originados.

    
por 30.09.2014 / 21:01

Tags