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

Untuk men-debug sesuatu seperti ini memeriksa nilai-nilai variabel Anda (dengan memasukkannya ke terminal) sering membawa Anda ke solusi dengan cepat.
kasterma

Jawaban:



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


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

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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.