Komut satırına girişi otomatik olarak gir

94

Her işlemde "y" girmesini istediği bir komut dosyası çalıştırıyorum, tüm girdilerimi bir defada geçirmek için $ ./script < echo 'yyyyyyyyyyyyyy' gibi bir çözüm arıyorum.

    
sordu NewMrd 29.08.2013 14:05

7 cevap

182

Bu durumda özel olarak oluşturulan bir komut var: yes

$ yes | ./script

Bunun anlamı ./script girdisini yes çıkışına bağlar. % Co_de% kullanıcı girdisini istediğinde, bunun yerine ./script çıktısını alır. % Co_de% 'sının çıkışı, yes ' si ve onu takiben bir satır sonu olan sonsuz bir akıştır. Temel olarak, kullanıcı yes 'lık her soru için y girdiyse.

Evet ( y ) yerine hayır ( ./script ) demek istiyorsanız, bunu şu şekilde yapabilirsiniz:

$ yes n | ./script

Bazı araçların sorma seçeneği sunmadığını ve her zaman n 'yi yanıt olarak beklediğini unutmayın. Örneğin buraya bakın: 'apt'deki yes / no komutunu atlayın -get yükseltme '

Girişi girmek için diğer yöntemler:

Komut dosyanızın kaç y 'sini beklediğini biliyorsanız, bunu şu şekilde yapabilirsiniz:

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

Yeni satırlar ( yes ) giriş anahtarlarıdır.

y yerine \n değerini kullanırsanız, daha ince taneli girdi denetimi 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

Tamlığı sağlamak için bir bu dokümanı da kullanabilirsiniz.

$ ./script << EOF
y
y
y
EOF

Ya da kabuğunuz bunu destekliyorsa, bir burada dize :

$ ./script <<< "y
y
y
"

Ya da her satırda bir girişe sahip bir dosya oluşturabilirsiniz:

$ ./script < inputfile

Komut yeterince karmaşıksa ve yukarıdaki yöntemler artık yeterli değilse, bekleyebilirsiniz .

İşte süper basit bir bekleyiş örneğinin bir örneği:

spawn ./script
expect "are you sure?"
send "yes\r"
expect "are you really sure?"
send "YES!\r"
expect eof

Teknik nitpick:

Sorunuzda belirttiğiniz varsayımlı komut çağırma işlemi çalışmıyor:

$ ./script < echo 'yyyyyyyyyyyyyy'
bash: echo: No such file or directory

Bunun nedeni kabuk dilbilgisinin bir yönlendirme operatörüne komut satırında herhangi bir yere 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

Yani printf yes argümanı ile çağrılacak ve stdin ./script isimli bir dosyadan girdi alacaktır. Ve bash dosya bulunmadığından şikayet ediyor.

    
verilen cevap lesmana 29.08.2013 14:08
6

Bazı şeyler (örneğin apt-get ), sessiz modda çalışmak için özel bayrakları kabul eder (ve varsayılanları kabul eder). % Co_de% 'sında, apt-get bayrağını geçirirsiniz. Bu tamamen sizin betiğinize bağlı.

Daha karmaşık şeylere ihtiyacınız varsa, komut dosyanızı beklenen bir komut dosyasına sarabilirsiniz. beklediğiniz çıktıyı okumanıza ve girdi göndermenize izin verir, böylece diğer komut dosyalarının izin veremeyeceği karmaşık şeyler yapabilirsiniz. İşte, Wikipedia sayfasından ö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
    
verilen cevap Oli 29.08.2013 14:12
5

Kabuk betiğinde ayrıca şu yumurtlamayı kullanabilir, bekleyebilir ve gönderebilirsiniz

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 komut dosyasını çalıştırırken elde etmeyi beklediğiniz ifadeyi vermeniz gerekecektir. Aşağıdaki bağlantıya gidin

Bash’te Bekleyin

    
verilen cevap Tarun 29.08.2013 14:35
5

yes komutunu kullan:

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'.
    
verilen cevap Peter W. Osel 11.04.2014 16:40
1

Tamam, bu çok zarif bir çözüm olmayabilir, ancak seçeneklerinizi ayrı bir dosyaya yazıp komut dosyasına bir girdi olarak aktarırsanız, bu da işe yarayacaktır. Böylece, tüm seçeneklerinizle yeni bir dosya oluşturursanız (bu dosyayı 'options.in' olarak adlandırın), komut dosyasını ./script.sh < options.in ile kolayca çalıştırabilir ve uygun şekilde farklı seçenekler dosyaları düzenleyebilir / oluşturabilirsiniz.

    
verilen cevap Sidhha 29.08.2013 17:50
0

Dialog'la bir bas taslak yazıyordum ve bunu otomatik olarak gerçekleşmesi gerekiyordu. Bunu yaptım ve bir çekicilik gibi çalıştı.

# -Wy force signaturewipe (if exists)
echo "y" | sudo lvcreate -W y -n $lvName -L "$lvSize"G /dev/"$svg" >> $nfsUtilLog
    
verilen cevap Benjamin G. West 03.08.2017 18:05
-3

Komut dosyanızdaki kullanıcı girdisini cat , bir metin dosyasından, komut dosyasına aktarılmış olarak bash gibi bir şema ile sağlayabilirsiniz:

cat input.txt | bash your_script.sh

İstediğiniz kullanıcı girdisini input.txt dosyanıza koyun, istediğiniz cevapları seçin - y, n, rakamlar, dizgiler, vb.

    
verilen cevap WebComer 05.07.2018 11:46

Etiketlerdeki diğer soruları oku