Bagaimana cara melewatkan output dari satu perintah sebagai argumen baris perintah ke perintah lainnya?

50

Jadi saya punya skrip yang, ketika saya berikan dua alamat, akan mencari dua tautan HTML:

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

Saya ingin mengirim ini ke wgetdan kemudian menyimpan output dalam file bernama temp.html. Saya mencoba ini, tetapi tidak berhasil. Adakah yang bisa menjelaskan mengapa dan / atau memberi saya solusi?

#!/bin/bash
url = echo "http://maps.google.be/maps?saddr\=$1\&daddr\=$2" |  sed 's/ /%/g'
wget $url
LotoLo
sumber
Untuk men-debug sesuatu seperti ini memeriksa nilai-nilai variabel Anda (dengan memasukkannya ke terminal) sering membawa Anda ke solusi dengan cepat.
kasterma

Jawaban:

48

Anda dapat menggunakan backticks (`) untuk mengevaluasi perintah dan mengganti dalam output perintah, seperti:

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

Dalam kasus Anda:

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

Anda bisa menggunakan "xargs". Contoh sepele:

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

Anda harus berhati-hati agar xargs tidak membagi stdin menjadi dua atau lebih pemanggilan komandan ("cat" pada contoh di atas).

Bruce Ediger
sumber
Saya berakhir di sini, karena saya tidak dapat mengingat nama perintah ini. Kasing penggunaan favorit saya memang: xargs -I% some_command --input =% -e -t -c (saya taruh di sini sebagai catatan untuk orang lain yang mengikuti jejak yang sama)
mpasko256
14

Anda sebenarnya tidak mengeksekusi baris url Anda:

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

Tampaknya Anda dapat menggunakan kombinasi jawaban di sini. Saya kira Anda ingin mengganti karakter ruang dengan nilai ascii yang lolos di url. Untuk melakukan ini, Anda harus menggantinya dengan "% 20", bukan hanya "%". Inilah solusi yang harus memberi Anda jawaban lengkap:

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

Backtick menunjukkan bahwa perintah terlampir harus ditafsirkan terlebih dahulu, dan hasilnya dikirim ke wget. Perhatikan, saya lolos dari spasi dan% chars di perintah sed untuk mencegah mereka disalahartikan. Opsi -q untuk wget mencegah pemrosesan output dari perintah yang dicetak ke layar (berguna untuk skrip ketika Anda tidak peduli tentang status di-kerja) dan opsi -O menentukan file output. FYI, jika Anda tidak ingin menyimpan output ke file, tetapi hanya melihatnya di terminal, gunakan "-" alih-alih nama file untuk menunjukkan stdout.

SethG
sumber
3

wget juga menerima stdin dengan -saklar.

Jika Anda ingin menyimpan output dalam file, gunakan -Oswitch.

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