¿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

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:



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).


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

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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.