Como faço para obter funções / aliases definidos em um script bash que é baixado de um servidor (e executado) para funcionar?

1

Eu tive um .bashrc que mudei para o servidor para que eu possa fazer o download e executá-lo por meio de wget :

wget -O - http://xxx.github.io/dotfiles/bashrc | bash

Ele é executado, mas todas as funções e aliases definidos nesse script não funcionam.

Existe alguma maneira de definir minhas funções como elas seriam se o script fosse executado localmente?

    
por laggingreflex 09.08.2014 / 03:53

2 respostas

1

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/stdin
Isso 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.

    
por 14.03.2017 / 05:56
-1

Tente isto:

wget -qO - https://raw.github.com/cescoferraro/dotfiles/master/src/os/setup.sh | xargs bash -c
    
por 14.03.2017 / 00:38

Tags