GNU/Linux >> Belajar Linux >  >> Linux

Mengotomatiskan input tekstual dari skrip bash tanpa menggunakan EOF

Untuk hampir semua program, baik echo $i | myprogram -options dan myprogram -options <<<$i harus bekerja, dengan memberi makan program $i melalui input standar.

<foo akan menggunakan isi file bernama foo sebagai stdin.

<<foo akan menggunakan teks antara itu dan garis yang hanya terdiri dari foo sebagai masukan standar. Ini adalah dokumen di sini (heredoc), seperti yang dikatakan Gilles; EOF tidak benar-benar berarti akhir dari file, itu hanya delineator heredoc umum (kami menggunakan "foo" sebagai gantinya dalam contoh ini).

<<<foo akan menggunakan string "foo" sebagai input standar. Anda juga dapat menentukan variabel $foo , dan shell akan menggunakan isinya sebagai stdin, seperti yang saya tunjukkan di atas. Ini disebut heresstring , karena menggunakan string pendek berbeda dengan seluruh blok, seperti dalam heredoc. Herestrings berfungsi di bash, tetapi tidak di /bin/sh .


Sintaks yang direkomendasikan oleh situs web ini disebut dokumen di sini. Input ke program file dimulai tepat di bawah baris yang berisi <<EOF , dan tidak diakhiri di akhir skrip, tetapi dengan baris yang persis berisi teks EOF (berhati-hatilah untuk tidak memiliki spasi ekstra). Omong-omong, Anda dapat menggunakan penanda akhir apa pun yang tidak mengandung karakter khusus shell apa pun:EOF bukan kata kunci, itu hanya tradisional.

#!/bin/bash
for i in {1..100}
do
   myprogram -options <<EOF
$i
EOF
   for j in {1..42}; do
     myprogram2 <<EOF
$i
$j
EOF
   done
done

di sini dokumen seperti yang disebutkan oleh Kevin dan Gilles di atas, atau perpipaan sederhana akan berfungsi dalam banyak kasus.

Untuk situasi yang lebih rumit, Anda mungkin ingin melihat ke dalam Harapkan atau yang serupa (mis. modul Harapan::Simple CPAN adalah implementasi perl yang sangat mudah digunakan). secara pribadi, saya lebih suka modul perl (Expect sendiri adalah tcl) tetapi ada implementasi untuk banyak bahasa scripting yang umum. Bahkan mungkin untuk menulis sangat implementasi primitif dari ide di sh atau bash menggunakan while dan read.

Gagasan umum dari Harapkan dan alat serupa adalah menunggu string atau pola tertentu dalam keluaran suatu program, dan kemudian memberinya masukan apa pun yang Anda inginkan.

Contoh penggunaan yang umum adalah untuk mengotomatiskan login, dengan "mengharapkan" (yaitu menunggu) string "ogin:", mengirim nama login, lalu mengharapkan string "word:" dan mengirim sandi.

Satu opsi terakhir, jika Anda memiliki sumber myprogram, cukup memodifikasinya untuk mengambil input yang ingin Anda berikan sebagai opsi baris perintah. Ini mungkin sedikit lebih banyak bekerja di muka, tetapi akan jauh lebih tidak memberatkan daripada bermain-main dengan Harapkan atau menyalurkan data ke dalam program yang tidak dirancang untuk digunakan seperti itu.

... dan jangan lupa untuk mengirimkan tambalan Anda ke myprogram back upstream :) Bahkan jika mereka tidak menyukai cara Anda mengkodekannya, mereka mungkin cukup menyukai ide itu untuk menambahkan fitur itu sendiri. Developer upstream cenderung menghargai orang yang berusaha keras dan berkontribusi daripada menuntut atau mengeluh.


Linux
  1. Pipa ke/dari clipboard dalam skrip Bash

  2. Skrip Bash:Menggunakan perintah skrip dari skrip bash untuk mencatat sesi

  3. Mengotomatiskan menjalankan perintah di Linux dari Windows menggunakan Putty

  1. mengotomatiskan sesi telnet menggunakan skrip bash

  2. Transfer file menggunakan lftp dalam skrip bash

  3. Bagaimana cara menambahkan pekerjaan crontab ke crontab menggunakan skrip bash?

  1. Mencegah skrip bash berjalan secara bersamaan

  2. Dapatkan Jalur Lengkap Dari Dalam Skrip Bash?

  3. Apakah Rsync ~/foo Target/foo Sama Dengan Rsync ~/foo/ Target/foo/?