Jawaban:
Ada perintah yang dibuat khusus untuk kasus itu: yes
$ yes | ./script
Apa yang dilakukan adalah menghubungkan output yes
ke input ./script
. Jadi ketika ./script
meminta input pengguna, ia akan mendapatkan output yes
. Output dari yes
adalah aliran tanpa akhir y
diikuti oleh baris baru. Jadi pada dasarnya seolah-olah pengguna memasukkan y
untuk setiap pertanyaan ./script
.
Jika Anda ingin mengatakan tidak ( n
) alih-alih ya ( y
), Anda dapat melakukannya seperti ini:
$ yes n | ./script
Perhatikan bahwa beberapa alat memiliki opsi untuk selalu menganggap yes
sebagai jawaban. Lihat di sini misalnya: Lewati konfirmasi ya / tidak di 'apt-get upgrade'
Metode lain untuk memasukkan input:
Jika Anda tahu persis berapa banyak y
skrip yang Anda harapkan, Anda dapat melakukannya seperti ini:
$ printf 'y\ny\ny\n' | ./script
Baris baru ( \n
) adalah tombol enter.
Menggunakan printf
alih-alih yes
Anda memiliki kontrol input berbutir halus:
$ printf 'yes\nno\nmaybe\n' | ./script
Perhatikan bahwa dalam beberapa kasus yang jarang terjadi, perintah tidak mengharuskan pengguna untuk menekan enter setelah karakter. dalam hal ini tinggalkan baris baru:
$ printf 'yyy' | ./script
Demi kelengkapan Anda juga dapat menggunakan dokumen di sini :
$ ./script << EOF
y
y
y
EOF
Atau jika shell Anda mendukungnya di sini :
$ ./script <<< "y
y
y
"
Atau Anda dapat membuat file dengan satu input per baris:
$ ./script < inputfile
Jika perintahnya cukup kompleks dan metode di atas tidak lagi cukup maka Anda dapat menggunakan harapkan .
Berikut adalah contoh skrip harapan super sederhana:
spawn ./script
expect "are you sure?"
send "yes\r"
expect "are you really sure?"
send "YES!\r"
expect eof
Nitpick teknis:
Doa perintah hipotetis yang Anda berikan dalam pertanyaan tidak berfungsi:
$ ./script < echo 'yyyyyyyyyyyyyy'
bash: echo: No such file or directory
Ini karena tata bahasa shell memungkinkan operator pengalihan di mana saja di baris perintah. Sejauh menyangkut shell baris perintah hipotetis Anda sama dengan baris ini:
$ ./script 'yyyyyyyyyyyyyy' < echo
bash: echo: No such file or directory
Itu berarti ./script
akan dipanggil dengan argumen 'yyyyyyyyyyyyyy'
dan stdin akan mendapatkan input dari file bernama echo
. Dan bash mengeluh karena file tersebut tidak ada.
cannot enable tty mode on non tty input
. Apakah Anda tahu solusinya?
printf
trik dengan run
file yang saya perlukan untuk mengotomatiskan proses instalasi, semua yang terjadi adalah saya mendapatkan pesan kesalahan yang mengatakan Warning: Tried to connect to session manager, None of the authentication protocols specified are supported
, dan skrip terbuka di terminal baru dan meminta saya untuk memasukkan input saya secara manual seperti biasa. Ngomong-ngomong, ini terjadi pada Debian. Ada saran?
Gunakan perintah yes
:
yes | script
Kutipan dari halaman manual:
NAME
yes - output a string repeatedly until killed
SYNOPSIS
yes [STRING]...
yes OPTION
DESCRIPTION
Repeatedly output a line with all specified STRING(s), or 'y'.
Beberapa hal ( apt-get
misalnya) menerima flag khusus untuk dijalankan dalam mode senyap (dan menerima default). Dalam apt-get
hal ini, Anda hanya memberikannya sebuah -y
bendera. Ini sepenuhnya tergantung pada skrip Anda.
Jika Anda membutuhkan hal-hal yang lebih rumit, Anda dapat membungkus skrip Anda dalam skrip harapan. harapkan memungkinkan Anda untuk membaca output dan mengirim input sehingga Anda dapat melakukan hal-hal yang cukup rumit yang tidak diizinkan oleh skrip lain. Ini salah satu contoh dari halaman Wikipedia-nya :
# Assume $remote_server, $my_user_id, $my_password, and $my_command were read in earlier
# in the script.
# Open a telnet session to a remote server, and wait for a username prompt.
spawn telnet $remote_server
expect "username:"
# Send the username, and then wait for a password prompt.
send "$my_user_id\r"
expect "password:"
# Send the password, and then wait for a shell prompt.
send "$my_password\r"
expect "%"
# Send the prebuilt command, and then wait for another shell prompt.
send "$my_command\r"
expect "%"
# Capture the results of the command into a variable. This can be displayed, or written to disk.
set results $expect_out(buffer)
# Exit the telnet session, and wait for a special end-of-file character.
send "exit\r"
expect eof
.sh
skrip shell, bukan? Atau ada jalan?
Dalam skrip shell Anda juga dapat menggunakan trik spawn berikut, harapkan dan kirim
spawn script.sh
expect "Are you sure you want to continue connecting (yes/no)?"
send "yes"
Namun dalam scenerio di atas Anda harus memberikan frasa yang Anda harapkan saat menjalankan skrip untuk lebih banyak contoh, buka tautan berikut
Oke, ini mungkin bukan solusi yang sangat elegan tetapi jika Anda menulis opsi dalam file terpisah dan meneruskannya sebagai input ke skrip, itu akan berfungsi juga. Jadi jika Anda membuat file baru dengan semua opsi Anda (sebut file ini sebagai 'options.in'), maka Anda dapat dengan mudah menjalankan skrip Anda dengan ./script.sh < options.in
dan mengedit / membuat file opsi yang berbeda sesuai kebutuhan.
options.in
file? Bisakah Anda memberi contoh?
Saya sedang menulis skrip bash dengan Dialog dan perlu ini terjadi secara otomatis juga. Saya melakukan ini dan itu bekerja seperti pesona.
# -Wy force signaturewipe (if exists)
echo "y" | sudo lvcreate -W y -n $lvName -L "$lvSize"G /dev/"$svg" >> $nfsUtilLog
Anda dapat memberikan input pengguna ke skrip Anda cat
, dari file teks, disalurkan ke skrip Anda dengan bash
seperti ini:
cat input.txt | bash your_script.sh
Masukkan saja input pengguna yang Anda inginkan ke file input.txt Anda, apa pun jawaban yang Anda inginkan - y, n, digit, string, dll.
-f
opsi bekerja dengan baik dengan perintah tertentu.