Secara otomatis memasukkan input pada baris perintah


143

Saya menjalankan skrip yang diminta memasukkan 'y' pada setiap operasi, saya mencari solusi seperti $ ./script < echo 'yyyyyyyyyyyyyy'untuk melewatkan semua input saya dalam satu waktu.


Terkadang -fopsi bekerja dengan baik dengan perintah tertentu.
iammilind

Jawaban:


259

Ada perintah yang dibuat khusus untuk kasus itu: yes

$ yes | ./script

Apa yang dilakukan adalah menghubungkan output yeske input ./script. Jadi ketika ./scriptmeminta input pengguna, ia akan mendapatkan output yes. Output dari yesadalah aliran tanpa akhir ydiikuti oleh baris baru. Jadi pada dasarnya seolah-olah pengguna memasukkan yuntuk 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 yessebagai jawaban. Lihat di sini misalnya: Lewati konfirmasi ya / tidak di 'apt-get upgrade'


Metode lain untuk memasukkan input:

Jika Anda tahu persis berapa banyak yskrip yang Anda harapkan, Anda dapat melakukannya seperti ini:

$ printf 'y\ny\ny\n' | ./script

Baris baru ( \n) adalah tombol enter.

Menggunakan printfalih-alih yesAnda 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 ./scriptakan dipanggil dengan argumen 'yyyyyyyyyyyyyy'dan stdin akan mendapatkan input dari file bernama echo. Dan bash mengeluh karena file tersebut tidak ada.


1
Saya mendapatkan cannot enable tty mode on non tty input. Apakah Anda tahu solusinya?
bmpasini

Ketika saya mencoba printftrik dengan runfile 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?
DavidB

butuh detail lebih lanjut terlalu besar untuk dikomentari. tolong ajukan pertanyaan baru dengan semua detailnya. Anda dapat meletakkan tautan di sini.
lesmana

tidak ada yang berhasil dengan 'penghancuran gelandangan' di centos
Drew

Mudah jahat! Bekerja pada impor data SQL Google Cloud Beta! Sangat dihargai!
G_Style

11

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

9

Beberapa hal ( apt-getmisalnya) menerima flag khusus untuk dijalankan dalam mode senyap (dan menerima default). Dalam apt-gethal ini, Anda hanya memberikannya sebuah -ybendera. 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

Ini tidak dapat digunakan dengan .shskrip shell, bukan? Atau ada jalan?
Shayan

7

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

Harapkan dalam Bash


2

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.indan mengedit / membuat file opsi yang berbeda sesuai kebutuhan.


Bagaimana saya harus menulis options.infile? Bisakah Anda memberi contoh?
Shayan

0

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

-1

Anda dapat memberikan input pengguna ke skrip Anda cat, dari file teks, disalurkan ke skrip Anda dengan bashseperti 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.



@muru Bagi saya, solusi yang Anda sebutkan tidak bekerja, jadi saya harus menciptakan sendiri.
WebComer

Tidak sepertinya. Anda berdua menggambarkan hal yang sama.
muru

@muru Ide yang sama untuk memberikan jawaban dari file (yang dapat dilakukan dengan beberapa cara) bukanlah hal yang sama, dan terlebih lagi melakukannya dengan cara yang sangat berbeda. Anda harus bisa melihatnya. Jika solusi yang Anda tunjukkan akan bekerja untuk saya, saya tidak akan menghabiskan waktu saya menciptakan kembali roda hari ini. Anda dapat menggunakan pekerjaan apa pun untuk Anda.
WebComer

@muru Saya percaya ada perbedaan antara keduanya, beberapa di antaranya dijelaskan dalam jawaban katakan di sini askubuntu.com/questions/172982/… . Bagi saya, misalnya, kode saya jika output diarahkan ke file tampak lebih jelas sebagai aliran alami dari kiri ke kanan. Lagi pula, downvoting solusi yang berfungsi dengan baik seperti Anda tidak merangsang orang untuk berbagi solusi mereka di sini. Saya percaya bahwa kata itu cukup untuk menghapus downvoting.
WebComer
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.