Come passare l'output di un comando come argomento della riga di comando a un altro?


50

Quindi ho uno script che, quando gli do due indirizzi, cercherà due collegamenti HTML:

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

Voglio inviarlo a wgete quindi salvare l'output in un file chiamato temp.html. Ho provato questo, ma non funziona. Qualcuno può spiegare perché e / o darmi una soluzione per favore?

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

Per eseguire il debug di qualcosa del genere, controllare i valori delle variabili (eseguendone l'eco sul terminale) spesso porta rapidamente alla soluzione.
Kasterma,

Risposte:



19

È possibile utilizzare "xargs". Un esempio banale:

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

Dovresti fare attenzione che xargs non divida il suo stdin in due o più invocazioni del comman ("cat" nell'esempio sopra).


Sono finito qui, perché non riuscivo a ricordare questo nome di comando. Il mio caso d'uso preferito era in effetti: xargs -I% some_command --input =% -e -t -c (l'ho messo qui come nota per altri che seguono la stessa traccia)
mpasko256

14

non stai effettivamente eseguendo la tua linea URL:

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

5

Sembra che tu possa usare una combinazione di risposte qui. Immagino che tu voglia sostituire i caratteri spaziali con i loro valori ASCII sfuggiti nell'URL. Per fare ciò, è necessario sostituirli con "% 20", non solo "%". Ecco una soluzione che dovrebbe darti una risposta completa:

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

I backtick indicano che il comando allegato deve essere prima interpretato e il risultato inviato a wget. Notate che sono sfuggito allo spazio e% char nel comando sed per impedire che vengano interpretati male. L'opzione -q per wget impedisce l'elaborazione dell'output dal comando sulla schermata (utile per gli script quando non ti interessa lo stato in-work) e l'opzione -O specifica il file di output. Cordiali saluti, se non si desidera salvare l'output in un file, ma solo visualizzarlo nel terminale, utilizzare "-" invece di un nome file per indicare stdout.


3

wget accetta anche stdin con l' -interruttore.

Se si desidera salvare l'output in un file, utilizzare l' -Oopzione.

echo http://maps.google.be/maps?saddr\=$1\&daddr\=$2 | sed 's/ /%/g' | wget -i- -O temp.html
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.