Como executar uma string de saída sem a substituição de comandos do bash?

1

Como executar uma string de saída sem a substituição de comando do bash?

Por exemplo, se eu digitar no terminal tshark , e o programa ainda não estiver instalado, receberei uma mensagem de erro como:

_some text_
sudo apt-get install tshark

Agora quero executar esta última linha sem copiar, colar ou transcrição.

Se eu tentar

$ tshark 2> >(tail -1)
sudo apt-get install tshark

Eu vou pegar essa última linha que quero executar.

E se eu quiser executar essa string, é claro que a substituição de comandos do bash funciona e instala tudo corretamente:

$ $(tshark 2> >(tail -1))

Mas se eu não usar a substituição de comando do bash, e canalizar isso para xargs como

$ tshark 2> >(tail -1) | xargs
sudo apt-get install tshark

Eu estou querendo saber porque a tubulação para xargs parece não ter efeito.

Mas se eu tentar

$ tshark 2> >(tail -1) | xargs xargs

sudo pergunta se eu está correto para senha, e que apt-get abbort depois de Y / N para instalar ou não.

O mesmo resultado ocorre se eu canalizar para bash .

Qualquer resposta ou sugestão é bem-vinda.

    
por John Goofy 13.07.2017 / 14:55

2 respostas

1

Resposta

Você não pode reutilizar a saída de um comando que não foi explicitamente capturado (pipes, etc.), a menos que você execute novamente o comando e capture a saída.

O Bash não armazena o comando output em nenhuma variável, diferentemente de como ele armazena códigos de saída de comando e histórico de comandos. Seu terminal tem a saída e o bash não se incomoda em manter uma cópia para si mesmo também.

Então, se você quiser evitar a substituição de comandos, eu vou concluir que você não pode chegar lá a partir daqui.

Opções

Se a questão real for "Como posso facilmente pegar a saída que eu vejo na linha acima no terminal e colocá-la no prompt de comando como um comando sem muita digitação?" você pode resolver isso de duas maneiras.

  1. Use readline atalhos para tornar a edição de um comando mais indolor.

Por exemplo, sua resposta à boa sugestão do @ choroba em outros lugares é que editar o último comando é muita digitação. Os atalhos readline CTRL-a e CTRL-e podem fazer a edição do último comando (alcançado com CTRL-p ao invés do UP waaaay para a direita) muito mais rápido.

  1. Use um multiplexador de terminal, como screen ou tmux . Eu prefiro tumx . Copiar e colar é bastante indolor com um simples CTRL +/- CTRL - [ para pular para o modo de cópia e mais algumas teclas VI e você acabou de copiar a linha que deseja no próximo prompt (com tmux setup com uma chave líder CTRL-a .

Espero que isso ofereça outras perspectivas.

    
por 13.07.2017 / 16:42
1

xargs executa o comando especificado nos argumentos lidos na entrada padrão. Se nenhum comando foi especificado, ele usa echo .

Com xargs xargs , o primeiro xargs lê os comandos e executa

xargs sudo apt-get install tshark

mas não há mais stdin, então não são adicionados mais argumentos. Mas como não há stdin, também não há respostas para perguntas interativas - elas estão lendo de stdin, que está conectado ao pipe, agora exausto. Você pode tentar executar o apt-get com --yes . (A solicitação de senha funciona como senhas que são não lidas de stdin por motivos de segurança).

    
por 13.07.2017 / 15:08