Como passar a saída de um comando como argumento da linha de comando para outro?

50

Então, eu tenho um script que, quando eu der dois endereços, procurará dois links HTML:

echo "http://maps.google.be/maps?saddr\=$1\&daddr\=$2" | sed 's/ /%/g'

Quero enviar isso para wgete salvar a saída em um arquivo chamado temp.html. Eu tentei isso, mas não funciona. Alguém pode explicar por que e / ou me dar uma solução, por favor?

#!/bin/bash
url = echo "http://maps.google.be/maps?saddr\=$1\&daddr\=$2" |  sed 's/ /%/g'
wget $url
LotoLo
fonte
Para depurar algo como isso, verificar os valores das variáveis ​​(ecoando-os no terminal) geralmente leva você à solução rapidamente.
kasterma

Respostas:

48

Você pode usar backticks (`) para avaliar um comando e substituir na saída do comando, como:

echo "Number of files in this directory: `ls | wc -l`"

No seu caso:

wget `echo http://maps.google.be/maps?saddr\=$1\&daddr\=$2 | sed 's/ /%/g'`
Michael Mrozek
fonte
19

Você pode usar "xargs". Um exemplo trivial:

ls -1 *.c | sort -n | xargs cat

Você teria que tomar cuidado para que o xargs não divida seu stdin em duas ou mais invocações do comman ("gato" no exemplo acima).

Bruce Ediger
fonte
Acabei aqui, porque não conseguia me lembrar desse nome de comando. Meu caso de uso favorito era de fato: xargs -I% algum_comando --input =% -e -t -c (eu colocá-lo aqui como uma nota para os outros que seguem o mesmo traço)
mpasko256
14

você não está realmente executando sua linha de URL:

#!/bin/sh
url="$(echo http://maps.google.be/maps?saddr\=$1\&daddr\=$2 | sed 's/ /%/g')"
wget $url
OneOfOne
fonte
5

Parece que você poderia usar uma combinação das respostas aqui. Suponho que você queira substituir caracteres de espaço por seus valores ASCII de escape no URL. Para fazer isso, você precisa substituí-los por "% 20", não apenas "%". Aqui está uma solução que deve fornecer uma resposta completa:

$ wget `echo http://maps.google.be/maps\?saddr\=$1\&daddr\=$2 | sed -e 's/\ /\%20/g'` -q -O temp.html

Os backticks indicam que o comando incluído deve ser interpretado primeiro e o resultado enviado ao wget. Observe que eu escapei do espaço e% chars no comando sed para impedir que eles sejam mal interpretados. A opção -q para wget impede que a saída de processamento do comando seja impressa na tela (útil para scripts quando você não se importa com o status de trabalho) e a opção -O especifica o arquivo de saída. FYI, se você não quiser salvar a saída em um arquivo, mas apenas visualizá-la no terminal, use "-" em vez de um nome de arquivo para indicar stdout.

SethG
fonte
3

O wget também aceita stdin com o -switch.

Se você deseja salvar a saída em um arquivo, use a -Oopção

echo http://maps.google.be/maps?saddr\=$1\&daddr\=$2 | sed 's/ /%/g' | wget -i- -O temp.html
abanar
fonte