Meneruskan argumen ke program interaktif secara non-interaktif

115

Saya memiliki skrip bash yang menggunakan ekstensi read perintah untuk membaca argumen ke perintah secara interaktif, misalnya opsi ya / tidak. Adakah cara untuk memanggil skrip ini dalam skrip non-interaktif dengan meneruskan nilai opsi default sebagai argumen?

Bukan hanya satu opsi yang harus saya berikan ke skrip interaktif.

sidharth sharma
sumber
2
Jika membaca dari stdin Anda bisa menyalurkan input Anda
lc.
4
Karena pertanyaan ini mendapat banyak duplikat, perlu diperhatikan bahwa tidak masalah dalam bahasa apa program interaktif tersebut ditulis. Ini bisa berupa program C yang membaca input standar, atau aplikasi Erlang, atau apa pun. Ada sesuatu yang berjalan dari baris perintah dan secara menjengkelkan menuntut masukan interaktif, dan Anda ingin mengotomatiskannya.
tripleee
Tentu saja, jika Anda memiliki kendali atas aplikasi yang menjengkelkan, tulis ulang sehingga dapat membaca jawaban secara non-interaktif (melalui file konfigurasi, opsi baris perintah, atau apa pun). Ini jauh lebih andal dan kuat terhadap perubahan urutan atau kata-kata pertanyaan interaktif.
tripleee

Jawaban:

46

Untuk tugas yang lebih kompleks ada expect( http://en.wikipedia.org/wiki/Expect ). Ini pada dasarnya mensimulasikan pengguna, Anda dapat membuat kode skrip bagaimana bereaksi terhadap keluaran program tertentu dan hal-hal terkait.

Ini juga berfungsi dalam kasus seperti sshitu yang melarang penyisipan kata sandi ke sana.

Dani Gehtdichnixan
sumber
8
... Meskipun solusi yang tepat dalam kasus SSH adalah beralih ke otentikasi kunci publik.
tripleee
154

Banyak jalan

menyalurkan masukan Anda

echo "yes
no
maybe" | your_program

mengarahkan ulang dari file

your_program < answers.txt

gunakan dokumen di sini (ini bisa sangat mudah dibaca)

your_program << ANSWERS
yes
no
maybe
ANSWERS

gunakan string di sini

your_program <<< $'yes\nno\nmaybe\n'
glenn jackman
sumber
5
Ini menunjukkan bahwa ini hanya berfungsi jika program membaca input standar. Beberapa program keluar dari jalan mereka untuk membaca misalnya kata sandi secara interaktif, bahkan ketika input standar adalah pipa. Untuk kata sandi, ini masuk akal untuk alasan keamanan; meskipun beberapa program interaktif hanya dirancang dengan buruk.
tripleee
@tripleee Sejalan dengan apa yang Anda katakan, bagaimana skrip membaca sandi yang tidak terpengaruh oleh stdin? Saya tahu Anda dapat menggunakan readuntuk mengambil stdin, fungsi apa yang dapat Anda gunakan untuk melakukan apa yang Anda jelaskan?
flow2k
Dalam hal ini, Anda perlu melihat apakah program yang Anda coba berinteraksi dengan memiliki cara khusus untuk mengirim masukan ke program tersebut (misalnya sshpass, ssh-agent), atau menggunakan perkirakan untuk skrip interaksi.
glenn jackman
2
Apa program seperti Expect lakukan adalah menjalankan klien di bawah pseudo-tty di mana terlihat klien seperti ada pengguna dengan terminal dan keyboard di ujung lainnya. Anda tidak dapat melakukannya dengan pipa biasa.
tripleee
Pemberitahuan Penting. Ini tidak berfungsi jika kita menambahkan spasi ke perintah yang disediakan.
71GA
13

Anda dapat memasukkan data ke dalam file dan mengarahkannya kembali seperti ini:

$ cat file.sh
#!/bin/bash

read x
read y
echo $x
echo $y

Data untuk skrip:

$ cat data.txt
2
3

Menjalankan skrip:

$ file.sh < data.txt
2
3
Guru
sumber
7

Hanya ingin menambahkan satu cara lagi. Menemukannya di tempat lain, dan cukup sederhana. Katakanlah saya ingin meneruskan ya untuk semua petunjuk di baris perintah untuk perintah "execute_command", Maka saya hanya akan menyalurkan ya untuk itu.

yes | execute_command

Ini akan menggunakan ya sebagai jawaban untuk semua pertanyaan ya / tidak.


sumber
2

Anda juga dapat menggunakan printf untuk menyalurkan input ke skrip Anda.

var=val
printf "yes\nno\nmaybe\n$var\n" | ./your_script.sh
spanchan
sumber
Itulah yang menyelamatkan saya. Terima kasih @spanchan.
sk001
0

alternatif lain bisa

echo "something" | tee /path/to/file

Perintah tee mencetak input yang diterimanya ke layar dan menyimpannya ke file pada saat yang bersamaan.

Prafulla Kumar Sahu
sumber