Ubuntu: Execute a saída de outro comando


13

Eu tenho uma linha de comando que gera uma linha de comando diferente, por exemplo:

> commandlineA param1 param2
  commandlineB param1

Gostaria de ter uma única execução de linha de comando que executará commandlineB com o (s) parâmetro (s) fornecido (s).

Existe alguma maneira simples de fazer isso usando uma única linha de comando ou preciso executar um pequeno arquivo bash que armazene a saída em uma variável e execute-a?

obrigado


2
Pesquisei por um bom tempo, mas acho que tive que postar uma pergunta para encontrar sozinho ... $ (commandlineA param1 param2) fez o trabalho.
Lior Ohana

Respostas:


17

Você parece ter resolvido isso sozinho, mas pode usar:

$(command parameter1 parameter2)

Edição de edição: o abaixo está um pouco errado, embora ele execute o comando em uma subshell, verifica-se que as variáveis ​​de ambiente ainda estarão disponíveis. Desculpe por pessoas enganosas ...

Edit: que será executado em um subshell, quaisquer variáveis ​​de ambiente não exportadas não serão usadas. Se você deseja executar um comando no mesmo shell, é necessário usar:

eval $(command parameter1 parameter2)

Outra resposta dada é canalizar através do próprio bash:

echo 'uname -a' | bash 

Isso também será executado em um subshell, para executar no mesmo shell que você precisará:

echo 'uname -a' | bash -c

Aliás, você também pode usar ticks de retorno em vez da sintaxe $ (), mas isso não é recomendado .


(1) Não sei exatamente o que você quer dizer com "isso será executado em um subshell". Variáveis ​​de ambiente não exportadas serão usadas. (2) Não vejo motivo para usar evalaqui. Se você tiver um motivo, explique-o. (3) Seu último exemplo (com  -c) está totalmente errado.
1175 Scott Scott

Você está correto, verifiquei novamente e estava errado lá. Ao executar como uma lista, os garfos do shell bash e as variáveis ​​de ambiente ainda estão disponíveis. Então você está correto, desculpe por isso.
Chris Sherlock

4

Usa isto:

commandlineA param1 param2 | bash

Exemplo:

echo "uname -a" | bash

Resultado:

Linux k1104 2.6.38-8-genérico # 42-Ubuntu SMP segunda-feira 11 de abril 03:31:50 UTC 2011 i686 i686 i386 GNU / Linux

Não há nada errado com isso, no entanto, ele gerará outra concha do bash.
Chris Sherlock

Assim será$(commandlineA param1 param2)
triplicado em 12/02/19

@ Tripleee: Você está comparando laranjas e abóboras.  printf '\143\144\040\057\n' | bashé, no final das contas, um não operacional, porque o comando é executado em um novo processo de shell separado (e transitório). Por outro lado, $(printf '\143\144\040\057\n')fará com que o shell interativo, ativo e atual mude de diretório.
Scott
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.