So I have a script that, when I give it two addresses, will search two HTML links:

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

I want to send this to wget and then save the output in a file called temp.html. I tried this, but it doesn't work. Can someone explain why and/or give me a solution please?

url = echo "http://maps.google.be/maps?saddr\=$1\&daddr\=$2" |  sed 's/ /%/g'
wget $url
  • For debugging something like this checking your variable values (by echo-ing them to the terminal) often gets you to the solution quickly.
    – kasterma
    Commented Dec 13, 2010 at 13:52

7 Answers 7


You can use backticks (`) to evaluate a command and substitute in the command's output, like:

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

In your case:

wget `echo http://maps.google.be/maps?saddr\=$1\&daddr\=$2 | sed 's/ /%/g'`
  • 42
    See Why $(...) is preferred over backticks.
    – jasonwryan
    Commented Aug 10, 2015 at 18:20
  • 1
    Note that ls | wc -l will count the number of lines outputted by ls, not the number of files in the current directory. To count files, use shopt -s nullglob dotglob; set -- *; printf '%s\n' "$#".
    – Kusalananda
    Commented Feb 6, 2022 at 7:07

You could use "xargs". A trivial example:

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

You would have to take care that xargs doesn't split its stdin into two or more invocations of the comman ("cat" in the example above).

  • 1
    I ended up here, because I couldn't remember this command name. My favorite use case was indeed: xargs -I % some_command --input=% -e -t -c (I put it here as a note for others that follow the same trace)
    – mpasko256
    Commented Dec 12, 2017 at 21:22
  • 1
    Hi @Bruce Ediger! I randomly stumbled across you when googling this :D Hope you're doing well!
    – frederix
    Commented May 18, 2020 at 20:49
  • 2
    Hey @frederix who let you in here? I see they will let just anyone in here these days! LOLOLOLOL
    – abgordon
    Commented May 18, 2020 at 20:53

you're not actually executing your url line :

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

It seems you could use a combination of the answers here. I'm guessing you are wanting to replace space chars with their escaped ASCII values in the URL.

To do this, you need to replace them with %20, not just %. Here's a solution that should give you a complete answer:

$ wget $(echo http://maps.google.be/maps\?saddr\=$1\&daddr\=$2 | sed -e 's/\ /\%20/g') -q -O temp.html
  • The $( ... ) indicate that the enclosed command should be interpreted first, and the result sent to wget. Notice I escaped the space and % chars in the sed command to prevent them from being misinterpreted.
  • The -q option for wget prevents processing output from the command being printed to the screen (handy for scripting when you don't care about the in-work status) and the -O option specifies the output file.

FYI, if you don't want to save the output to a file, but just view it in the terminal, use - instead of a filename to indicate stdout.


xargs is the best option to place output from a command into the argument of another command.

Suppose the output of command1 is 3 and you want your next command to take this 3 as an argument, you will want something like this

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

So, for this you can do like so

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

Where 4 and 5 are the other two arguments that may be needed for command2.

You can place the curly brackets in the position where you want the output from first command.

So, use

command1 | xargs -I{} command2 {} 
  • Can u elaborate? Give a example... Because i tried it here and did'nt work. I did'nt understand. I tried: ps -fA | grep {} | head -n 1 | xargs -I{} lsof -i:80 | awk -F ' ' '{if(NR>1)print $2}' {} It did'nt work... Command lsof + awk gets PID of proccess, and ps + grep outputs what proccess has this PID. Commented May 3, 2022 at 17:35
  • Errors: → awk: cannot open {} (No such file or directory) → xargs: lsof: terminated by signal 13 Commented May 3, 2022 at 17:35

wget also accepts stdin with the - switch.

If you want to save the output in a file, use the -O switch.

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

Note: I prefer the xargs option over the next one.

Following is another solution using a function that provides the output of the first command argument as elements into the $i variable to the second command argument


my_lambda() { for i in "$1"; do eval ${2}; done; }


my_lambda "$(find ~/Documents | grep *.pdf)" "ls -l $i"

You must log in to answer this question.