Dapatkan perintah interaktif untuk menjawab skrip bash [duplikat]

109

Apakah mungkin memiliki skrip bash secara otomatis menangani perintah yang biasanya disajikan kepada pengguna dengan tindakan default? Saat ini saya menggunakan skrip bash untuk memanggil alat internal yang akan menampilkan petunjuk kepada pengguna (meminta Y / T) untuk menyelesaikan tindakan, namun skrip yang saya tulis harus sepenuhnya "lepas tangan", jadi Saya perlu cara untuk mengirim Y|Nke prompt untuk memungkinkan program melanjutkan eksekusi. Apakah ini mungkin?

TJ L
sumber
ini bukan "pelengkapan otomatis" ... seperti yang dikatakan @unwind, ini "otomatisasi"
benzaita
3
Contoh penggunaan yesuntuk melakukan ini: unix.stackexchange.com/questions/47344/…
Droogans

Jawaban:

65

Ini bukan "pelengkapan otomatis", ini adalah otomatisasi. Salah satu alat umum untuk hal-hal ini disebut Harapan .

Anda mungkin juga lolos hanya dengan memasukkan masukan dari yes.

beristirahat
sumber
3
Sayangnya saya tidak dapat menggunakan harapan karena persyaratan ruang mereka yang ketat pada sistem yang menjalankan ini sehingga saya tidak dapat menambahkan paket tambahan, tetapi menyalurkan yesmelakukan triknya, untungnya semua petunjuknya hanya memerlukan 'y'. Terima kasih.
TJ L
Namun Yes | commandmungkin tidak selalu berhasil. Jika itu hanya untuk tujuan instalasi maka saya merasa menggunakan -yadalah pilihan yang lebih baik dan lebih disukai.
Umesh Kaushik
169

Sederhana

echo "Y Y N N Y N Y Y N" | ./your_script

Ini memungkinkan Anda untuk meneruskan urutan "Y" atau "N" ke skrip Anda.

Loïc Février
sumber
3
Jika saya perlu mengirim apapun N, saya akan menggunakan metode ini, tapi saya hanya membutuhkan Y jadi saya pergi dengan yes. Sayang sekali saya tidak bisa menerima dua jawaban, karena keduanya benar.
TJ L
3
;) Nah jika Anda perlu mengirim beberapa NAnda sekarang memiliki cara yang baik untuk melakukannya.
Loïc Février
2
Ini tidak berhasil untuk saya; spasi tidak dihitung sebagai baris baru --- jika misalnya saya menggemakan "Y N" maka itu memberikan string "Y N"sebagai input ke prompt pertama dan berhenti pada prompt kedua menunggu saya untuk menyelesaikannya. Saya mencoba mengubah spasi menjadi baris baru tetapi itu tidak berhasil, masih memberikan string literal ke prompt.
temporary_user_name
52
coba gunakan printf 'y\ny\ny\n' | ./your_script. Dengan cara ini Anda memasukkan baris baru secara manual untuk setiap entri yang diharapkan.
Majid
8
printf '%s\n' Y Y N N Y N Y Y Nmenempatkan baris baru di antara item, tetapi tanpa perlu satu string format besar.
Charles Duffy
16

Saya menemukan cara terbaik untuk mengirim masukan adalah dengan menggunakan cat dan file teks untuk menyampaikan masukan apa pun yang Anda butuhkan.

cat "input.txt" | ./Script.sh
Alex
sumber
Berharap tidak bekerja seperti yang diharapkan untuk saya. Ini adalah jawaban paling sederhana dan terbaik untuk pertanyaan ini.
cloudxix
12

Jika Anda hanya memiliki Y untuk dikirim:

$> yes Y |./your_script

Jika Anda hanya memiliki N untuk mengirim:

$> yes N |./your_script
douardo
sumber
9

Dalam situasi saya, saya perlu menjawab beberapa pertanyaan tanpa Y atau N tetapi dengan teks atau kosong. Saya menemukan cara terbaik untuk melakukan ini dalam situasi saya adalah dengan membuat file shellscript. Dalam kasus saya, saya menyebutnya pelengkapan otomatis.sh

Saya perlu menjawab beberapa pertanyaan untuk eksportir skema doktrin sehingga file saya terlihat seperti ini.

- Ini hanya contoh -

php vendor/bin/mysql-workbench-schema-export mysqlworkbenchfile.mwb ./doctrine << EOF
`#Export to Doctrine Annotation Format`                                     1
`#Would you like to change the setup configuration before exporting`        y
`#Log to console`                                                           y
`#Log file`                                                                 testing.log
`#Filename [%entity%.%extension%]`
`#Indentation [4]`
`#Use tabs [no]`
`#Eol delimeter (win, unix) [win]`
`#Backup existing file [yes]`
`#Add generator info as comment [yes]`
`#Skip plural name checking [no]`
`#Use logged storage [no]`
`#Sort tables and views [yes]`
`#Export only table categorized []`
`#Enhance many to many detection [yes]`
`#Skip many to many tables [yes]`
`#Bundle namespace []`
`#Entity namespace []`
`#Repository namespace []`
`#Use automatic repository [yes]`
`#Skip column with relation [no]`
`#Related var name format [%name%%related%]`
`#Nullable attribute (auto, always) [auto]`
`#Generated value strategy (auto, identity, sequence, table, none) [auto]`
`#Default cascade (persist, remove, detach, merge, all, refresh, ) [no]`
`#Use annotation prefix [ORM\]`
`#Skip getter and setter [no]`
`#Generate entity serialization [yes]`
`#Generate extendable entity [no]`                                          y
`#Quote identifier strategy (auto, always, none) [auto]`
`#Extends class []`
`#Property typehint [no]`
EOF

Hal yang saya suka tentang strategi ini adalah Anda dapat mengomentari apa jawaban Anda dan menggunakan EOF baris kosong hanya itu (jawaban default). Ternyata alat eksportir ini memiliki mitra JSON sendiri untuk menjawab pertanyaan-pertanyaan ini, tetapi saya mengetahuinya setelah saya melakukan ini =).

untuk menjalankan skrip cukup berada di direktori yang Anda inginkan dan jalankan 'sh autocomplete.sh'di terminal.

Singkatnya dengan menggunakan << EOL & EOF dalam kombinasi dengan Garis Kembali, Anda dapat menjawab setiap pertanyaan dari prompt yang diperlukan. Setiap baris baru adalah jawaban baru.

Contoh saya hanya menunjukkan bagaimana ini bisa dilakukan dengan komentar juga menggunakan karakter `sehingga Anda ingat apa setiap langkahnya.

Perhatikan keuntungan lain dari metode ini adalah Anda dapat menjawab dengan lebih dari hanya Y atau N ... sebenarnya Anda dapat menjawab dengan kosong!

Semoga ini membantu seseorang.

Joseph Astrahan
sumber
4

Ada kegunaan bawaan khusus untuk ini - ' ya '.

Untuk menjawab semua pertanyaan dengan jawaban yang sama, Anda bisa lari

yes [answer] |./your_script

Atau Anda bisa memasukkannya ke dalam naskah Anda yang memiliki jawaban spesifik untuk setiap pertanyaan

Asaf Pinhassi
sumber
bagaimana saya bisa melakukannya di dalam skrip? maksud saya untuk menentukan jawaban yang berbeda untuk setiap pertanyaan
Sengo