Yanıtlar:
Bu durumda özel olarak oluşturulan bir komut var: yes
$ yes | ./script
Bunun yaptığı şey, çıktılarını yes
girişine bağlamaktır ./script
. Bu yüzden ./script
kullanıcı girişi istediğinde, bunun yerine çıktısını alır yes
. Çıkışı, ardından gelen yeni bir satır yes
olan sonsuz bir akış y
. Yani temelde kullanıcı y
her soru için giriyor sanki ./script
.
n
Evet ( y
) yerine hayır ( ) demek istiyorsanız, bunu şöyle yapabilirsiniz:
$ yes n | ./script
Bazı araçların her zaman yes
cevap 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:
y
Komut 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.
printf
Bunun yerine kullanarak yes
daha 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?
printf
Hile run
kurulum 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 supported
ve 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-get
durumda, sadece bir -y
bayrakla 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
.sh
kabuk 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.in
ve farklı seçenek dosyalarını uygun şekilde düzenleyebilir / oluşturabilirsiniz.
options.in
Dosyayı 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.
-f
seçenek belirli komutlarla iyi çalışır.