¿Cómo pasar la salida de un comando como argumento de línea de comando a otro?

50

Entonces tengo un script que, cuando le doy dos direcciones, buscará dos enlaces HTML:

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

Quiero enviar esto wgety luego guardar la salida en un archivo llamado temp.html. Intenté esto, pero no funciona. ¿Alguien puede explicar por qué y / o darme una solución por favor?

#!/bin/bash
url = echo "http://maps.google.be/maps?saddr\=$1\&daddr\=$2" |  sed 's/ /%/g'
wget $url
LotoLo
fuente
Para depurar algo como esto, verificar los valores de sus variables (haciéndolos eco en el terminal) a menudo lo lleva a la solución rápidamente.
kasterma

Respuestas:

48

Puede usar las teclas de retroceso (`) para evaluar un comando y sustituirlo en la salida del comando, como:

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

En tu caso:

wget `echo http://maps.google.be/maps?saddr\=$1\&daddr\=$2 | sed 's/ /%/g'`
Michael Mrozek
fuente
13
Ver por qué $(...)se prefiere sobre backticks .
jasonwryan
19

Podrías usar "xargs". Un ejemplo trivial:

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

Debería tener cuidado de que xargs no divida su stdin en dos o más invocaciones del comandante ("gato" en el ejemplo anterior).

Bruce Ediger
fuente
Terminé aquí, porque no podía recordar el nombre de este comando. Mi caso de uso favorito fue: xargs -I% some_command --input =% -e -t -c (lo puse aquí como una nota para otros que siguen el mismo rastro)
mpasko256
14

en realidad no estás ejecutando tu línea de URL:

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

Parece que podría usar una combinación de las respuestas aquí. Supongo que desea reemplazar los caracteres espaciales con sus valores ascii escapados en la url. Para hacer esto, debe reemplazarlos con "% 20", no solo "%". Aquí hay una solución que debería darle una respuesta completa:

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

Los backticks indican que el comando adjunto debe interpretarse primero y el resultado debe enviarse a wget. Observe que escapé del espacio y los caracteres% en el comando sed para evitar que se malinterpreten. La opción -q para wget evita el procesamiento de salida del comando que se imprime en la pantalla (útil para secuencias de comandos cuando no le importa el estado en el trabajo) y la opción -O especifica el archivo de salida. Para su información, si no desea guardar la salida en un archivo, sino simplemente verla en la terminal, use "-" en lugar de un nombre de archivo para indicar stdout.

SethG
fuente
3

wget también acepta stdin con el -interruptor.

Si desea guardar la salida en un archivo, use el -Ointerruptor.

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