Yanıtlar:
Bu durumda özel olarak oluşturulan bir komut var: yes
$ yes | ./script
Bunun yaptığı şey, çıktılarını yesgirişine bağlamaktır ./script. Bu yüzden ./scriptkullanıcı girişi istediğinde, bunun yerine çıktısını alır yes. Çıkışı, ardından gelen yeni bir satır yesolan sonsuz bir akış y. Yani temelde kullanıcı yher soru için giriyor sanki ./script.
nEvet ( y) yerine hayır ( ) demek istiyorsanız, bunu şöyle yapabilirsiniz:
$ yes n | ./script
Bazı araçların her zaman yescevap olarak kabul etme seçeneği olduğunu unutmayın . Örnek için buraya bakınız: 'apt-get upgrade' içindeki evet / hayır istemini atlayın
Giriş girmek için diğer yöntemler:
yKomut dosyanızın tam olarak kaç tane beklediğini biliyorsanız, aşağıdaki gibi yapabilirsiniz:
$ printf 'y\ny\ny\n' | ./script
Newlines ( \n), giriş tuşlarıdır.
printfBunun yerine kullanarak yesdaha hassas girdi kontrolü elde edersiniz:
$ printf 'yes\nno\nmaybe\n' | ./script
Bazı nadir durumlarda komutun kullanıcının karakterden sonra enter tuşuna basmasını gerektirmediğini unutmayın. bu durumda yeni satırları dışarıda bırakın:
$ printf 'yyy' | ./script
Bütünlüğü sağlamak için burada bir belge de kullanabilirsiniz :
$ ./script << EOF
y
y
y
EOF
Veya kabuğunuz burada bir dize destekliyorsa :
$ ./script <<< "y
y
y
"
Veya satır başına bir giriş içeren bir dosya oluşturabilirsiniz:
$ ./script < inputfile
Komut yeterince karmaşıksa ve yukarıdaki yöntemler artık yeterli değilse, beklentinizi kullanabilirsiniz .
İşte bir süper basit bekliyor komut dosyası örneği:
spawn ./script
expect "are you sure?"
send "yes\r"
expect "are you really sure?"
send "YES!\r"
expect eof
Teknik nitpick:
Sorunuzda verdiğiniz varsayımsal komut çağrısı çalışmıyor:
$ ./script < echo 'yyyyyyyyyyyyyy'
bash: echo: No such file or directory
Bunun nedeni, kabuk dilbilgisinin komut satırının herhangi bir yerinde bir operatöre yönlendirilmesine izin vermesidir. Kabuk söz konusu olduğunda, varsayımsal komut satırınız bu satırla aynıdır:
$ ./script 'yyyyyyyyyyyyyy' < echo
bash: echo: No such file or directory
Bu ./script, argümanla çağrılacak 'yyyyyyyyyyyyyy've stdin adlı bir dosyadan girdi alacaktır echo. Ve dosya olmadığından bash şikayet ediyor.
cannot enable tty mode on non tty input. Bunun için bir geçici çözüm biliyor musunuz?
printfHile runkurulum sürecini otomatikleştirmek için gereken bir dosyayla denediğimde, olan tek şey bir hata mesajı alıyorum Warning: Tried to connect to session manager, None of the authentication protocols specified are supportedve komut dosyası yeni bir terminalde açılıyor ve girişimi her zamanki gibi manuel olarak girmemi istiyor. Bu arada Debian'da oluyor. Baska öneri?
Komutu kullanın yes:
yes | script
Man sayfasından alıntı:
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'.
Bazı şeyler ( apt-getörneğin) sessiz modda çalışmak için özel bayraklar kabul eder (ve varsayılanları kabul eder). Bu apt-getdurumda, sadece bir -ybayrakla geçersiniz . Bu tamamen sizin betiğine bağlıdır.
Daha karmaşık şeylere ihtiyacınız varsa, betiğinizi bir bekleme betiğine sarabilirsiniz. bekliyoruz çıktıyı okumanıza ve girdi göndermenize izin verir, böylece diğer komut dosyalarının izin vermeyeceği karmaşık işleri yapabilirsiniz. İşte Wikipedia sayfasındaki örneklerden biri :
# 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
.shkabuk betiği ile kullanılamaz , değil mi? Yoksa bir yolu var mı?
Kabuk betiğinde ayrıca aşağıdaki yumurtlama hilesini kullanabilirsiniz, bekleyin ve gönderin
spawn script.sh
expect "Are you sure you want to continue connecting (yes/no)?"
send "yes"
Ancak yukarıdaki senaryoda, daha fazla örnek için betiği yürütürken almayı beklediğiniz ifadeyi vermek zorunda kalacaksınız.
Tamam, bu çok zarif bir çözüm olmayabilir, ancak seçeneklerinizi ayrı bir dosyaya yazar ve sonra betiğe girdi olarak iletirseniz, de işe yarayabilir. Bu nedenle, tüm seçeneklerinizle yeni bir dosya oluşturursanız (bu dosyayı 'options.in' olarak adlandırın), komut dosyanızı kolayca çalıştırabilir ./script.sh < options.inve farklı seçenek dosyalarını uygun şekilde düzenleyebilir / oluşturabilirsiniz.
options.inDosyayı nasıl yazmalıyım ? Bir örnek verebilir misin?
Dialog ile bir bash betiği yazıyordum ve bunun da otomatik olarak gerçekleşmesi gerekiyordu. Bunu yaptım ve bir cazibe gibi çalıştı.
# -Wy force signaturewipe (if exists)
echo "y" | sudo lvcreate -W y -n $lvName -L "$lvSize"G /dev/"$svg" >> $nfsUtilLog
Betiğinize kullanıcı girişini cat, bir metin dosyasından betiğinize şu şekilde aktarılmış olarak sağlayabilirsiniz bash:
cat input.txt | bash your_script.sh
İstediğiniz kullanıcı girişini input.txt dosyasına, istediğiniz cevapları ne olursa olsun - y, n, rakamlar, karakter dizileri, vs.
-fseçenek belirli komutlarla iyi çalışır.