Bash: Execute linhas canalizadas de stdin

4

Eu não encontrei uma solução para isso após algumas pesquisas. Eu acho que os termos de pesquisa são muito gerais. Eu gostaria de saber como executar um número de linhas (no prompt do bash) que são geradas por alguma outra fonte. Por exemplo, eu tenho um script Python que gera dinamicamente um número de comandos bash e print s para stdout. Eu gostaria que essas linhas fossem executadas como um script bash sem ter que salvá-las no disco. Por exemplo:

$ python example.py
touch 1 2 3 4 5
rm 1 2 3 4 5
echo "Done"

Gostaria de fazer algo como:

$ python example.py | executeLines

Esse comando / recurso existe no bash? Às vezes, um dos comandos pode sair com um status de saída diferente de zero, portanto, anexando && a cada comando e executando:

$ 'python example.py'

nem sempre funciona e parece ser uma solução desajeitada.

    
por SabreWolfy 06.10.2011 / 17:42

5 respostas

9

Você já tentou

$ python example.py | bash

Deve funcionar, pois é um truque bastante comum. Por exemplo, a munin da ferramenta de monitoramento tem um configurador de nós (munin-node-configure) que informa quais plugins você pode executar e, em seguida, pega um --shell que faz com que ele cuspa vários comandos ln -s para vincular os plugins, quando canalizados diretamente para o bash.

Houve até uma vez uma ferramenta para configurar algo - foi há mais de 15 anos, não me lembro o quê - onde você se tornaria root e faria a configuração abrindo uma sessão de telnet para um autoconfigurador e enviaria a saída direto para bater, com

# telnet example.com 7001 | bash

Eu não posso imaginar fazendo algo assim hoje em dia.

    
por 06.10.2011 / 17:48
3

Eu faria isso:

python example.py | while read command; do $command; done

O status de saída diferente de zero pode ser contornado usando ; em vez de && , a propósito.

    
por 06.10.2011 / 17:51
1

Outra técnica que você pode usar em vez de canalizar para um subprocesso bash é o eval shell embutido para casos em que você precisa que o código do shell gerado dependa de algo no ambiente atual do shell ou deseje a saída do seu programa para incluir ações como definir variáveis de ambiente no processo de shell atual.

Por exemplo, digamos que sua saída foi mais assim:

$ python example.py
PATH="$PATH:/opt/wackysoft/bin"
export PATH
echo $PATH
which wackysoft-command

Você pode querer manter a variável de ambiente PATH alterada em sua sessão atual, então você usaria eval . Por exemplo:

$ eval "'python example.py'"
/bin:/sbin:/usr/bin:/usr/sbin:/opt/wackysoft/bin
/opt/wackysoft/bin/wackysoft-command
$ echo $PATH
/bin:/sbin:/usr/bin:/usr/sbin:/opt/wackysoft/bin
$ which wackysoft-command
/opt/wackysoft/bin/wackysoft-command

Isso é semelhante a como programas como ssh-agent são geralmente chamados nos arquivos de configuração .xsession ou .profile.

    
por 06.10.2011 / 18:47
0

Você não pode simplesmente executá-los como subprocessos de dentro do seu script Python, com a ajuda do os.system chama?

    
por 06.10.2011 / 17:47
-1

O que você está procurando é exatamente o que xargs faz.

    
por 06.10.2011 / 17:56