web-dev-qa-db-fra.com

Comment passer la sortie d'une commande comme argument de ligne de commande à une autre?

J'ai donc un script qui, lorsque je lui donne deux adresses, va rechercher deux liens HTML:

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

Je veux envoyer ceci à wget puis enregistrer la sortie dans un fichier appelé temp.html. J'ai essayé ça, mais ça ne marche pas. Quelqu'un peut-il expliquer pourquoi et/ou me donner une solution s'il vous plaît?

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

Vous pouvez utiliser des backticks (`) pour évaluer une commande et la remplacer dans la sortie de la commande, comme:

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

Dans ton cas:

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

Vous pouvez utiliser "xargs". Un exemple trivial:

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

Vous devez vous assurer que xargs ne divise pas son stdin en deux invocations ou plus de la virgule ("cat" dans l'exemple ci-dessus).

20
Bruce Ediger

vous n'exécutez pas réellement votre ligne d'URL:

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

Il semble que vous puissiez utiliser une combinaison des réponses ici. Je suppose que vous voulez remplacer les caractères d'espace par leurs valeurs ascii échappées dans l'url. Pour ce faire, vous devez les remplacer par "% 20", pas seulement "%". Voici une solution qui devrait vous donner une réponse complète:

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

Les backticks indiquent que la commande incluse doit être interprétée en premier et le résultat envoyé à wget. Remarquez que j'ai échappé à l'espace et aux caractères% dans la commande sed pour éviter qu'ils soient mal interprétés. L'option -q pour wget empêche le traitement de la sortie de la commande imprimée à l'écran (pratique pour les scripts lorsque vous ne vous souciez pas du statut en cours de travail) et l'option -O spécifie le fichier de sortie. Pour info, si vous ne souhaitez pas enregistrer la sortie dans un fichier, mais simplement l'afficher dans le terminal, utilisez "-" au lieu d'un nom de fichier pour indiquer stdout.

5
SethG

wget accepte également stdin avec le - commutateur.

Si vous souhaitez enregistrer la sortie dans un fichier, utilisez le -O commutateur.

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

xargs est la meilleure option pour placer la sortie d'une commande dans l'argument d'une autre commande.

Supposons que la sortie de command1 soit 3 et vous voulez que votre prochaine commande prenne cette 3 comme argument pour que vous vouliez quelque chose comme

command2 3(which is output of 1st command) 4 5

Pour ça tu peux aller comme

command1 | xrgs -I{} command2 {} 4 5

où 4 et 5 sont deux autres arguments qui peuvent être nécessaires pour command2.

Vous pouvez mettre ces accolades à l'endroit de l'argument où vous voulez la sortie de la première commande.

Alors, utilisez

command1 | xrgs -I{} command2 {} 
0
Ria Sharma