Como garyjohn descrito em seu comentário , o problema com
wget (options and args) | bashé isso, pelo menos algumas conchas (bash aparentemente sendo uma delas), um pipeline (
cmd1 | cmd2
)
força todos os comandos do componente em processos separados.
Quando você executa something | bash
,
o processo de shell bash recém-gerado é um processo separado
do seu shell principal, pai e interativo.
Todas as funções, aliases, etc.
que são definidos na saída do comando à esquerda
será definido no novo shell bash -
que então sairá sem ler nenhum comando
do seu terminal / teclado,
assim, jogando-o de volta na sua concha original,
sem as funções, etc.
Como garyjohn sugeriu, uma maneira de resolver esse problema e obter as funções, aliases, etc., definidas no seu shell principal é baixar os comandos em um arquivo e, em seguida, fonte dele; por exemplo,
wget -O - http://xxx.github.io/dotfiles/bashrc > bashrc && . bashrc && rm bashrc
Mas esse não é o único caminho. O truque é criar um pipe sem criar um pipeline. O truque para fazer isso é usando substituição de processo (uma extensão bash para comando de substituição ).
. <(wget -O - http://xxx.github.io/dotfiles/bashrc)
irá definir as funções, aliases, etc., sem criar um arquivo temporário.
Outra abordagem é
wget -O - http://xxx.github.io/dotfiles/bashrc | . /dev/stdinIsso não funcionará para o bash (porque ele faz o comando
.
em um subshell),
mas pode funcionar para algumas outras shells (por exemplo, ksh).
Naturalmente, o aviso padrão se aplica: seja cauteloso sobre a execução de comandos baixados da web. Se você estiver usando um servidor reforçado em uma rede local, o acima pode ser um pouco seguro. Caso contrário, se alguém invadir o servidor da web, você está abrindo a porta para ele executar comandos arbitrários em sua máquina. Seria mais seguro (embora claramente mais tedioso) para baixar os comandos em um arquivo e, em seguida, soma-o. Então, se a soma de verificação estiver correta, você poderá fornecer o arquivo.