Bash komut dosyasının etkileşimli istemleri yanıtlaması [yineleme]


109

Normalde kullanıcıya varsayılan eylemlerle sunulacak istemleri otomatik olarak işleyen bir bash betiğinin olması mümkün müdür? Şu anda, kullanıcıya eylemleri tamamlamak için istemleri gösterecek (E / H'yi isteyen) şirket içi bir aracı çağırmak için bir bash komut dosyası kullanıyorum, ancak yazdığım komut dosyasının tamamen "el değmeden" olması gerekiyor, bu nedenle Y|NProgramın çalışmaya devam etmesine izin vermek için komut istemine göndermenin bir yoluna ihtiyacım var . Mümkün mü?


bu "otomatik tamamlama" değil ... @unwind'ın dediği gibi, bu "otomasyon"
benzaita

3
yesBunu yapmak için kullanma örneği : unix.stackexchange.com/questions/47344/…
Droogans

Yanıtlar:


65

Bu "otomatik tamamlama" değil, bu otomasyondur. Bunlar için yaygın olarak kullanılan araçlardan biri de Beklentidir .

Sadece boru girişiyle de kurtulabilirsiniz yes.


3
Ne yazık ki, bunu çalıştıran sistemde katı alan gereksinimleri olduğu için beklemeyi kullanamıyorum, bu yüzden fazladan paketler ekleyemem, ancak borulama yeshile yaptı, neyse ki tüm istemler zaten bir 'y' gerektirdi. Teşekkürler.
TJ L

Ancak Yes | commandher zaman çalışmayabilir. Sadece kurulum amaçlıysa, kullanmaya düştüm -ydaha iyi ve tercih edilen bir seçenektir.
Umesh Kaushik

169

Basit

echo "Y Y N N Y N Y Y N" | ./your_script

Bu, komut dosyanıza herhangi bir "Y" veya "N" dizisi geçirmenize izin verir.


3
Herhangi birini göndermem Ngerekirse, bu yöntemi kullanırdım, ancak yalnızca Y'lere ihtiyacım vardı, bu yüzden gittim yes. Ne yazık ki ikisi de doğru olduğu için iki cevabı kabul edemem.
TJ L

3
;) Eğer bazılarını göndermeniz Ngerekirse, şimdi bunu yapmak için iyi bir yolunuz var.
Loïc Février

2
Bu benim için çalışmıyor; boşluklar yeni satırlar olarak sayılmaz - örneğin "Y H" yi yankıladığımda, dizeyi "Y N"ilk komut istemine girdi olarak verir ve onu tamamlamamı bekleyen ikinci istemde asılı kalır. Boşlukları satırsonu olarak değiştirmeyi denedim, ancak bu da işe yaramadı, yine de komuta birebir dize verdi.
temporary_user_name

52
kullanmayı deneyin printf 'y\ny\ny\n' | ./your_script. Bu şekilde, beklenen her giriş için yeni satırı manuel olarak eklersiniz.
Majid

8
printf '%s\n' Y Y N N Y N Y Y Ntek bir büyük biçim dizesine gerek kalmadan öğeler arasına yeni satırlar koyar.
Charles Duffy

16

Girdi göndermenin en iyi yolunun, ihtiyacınız olan girdiyi iletmek için cat ve bir metin dosyası kullanmak olduğunu buldum.

cat "input.txt" | ./Script.sh

Bekle beklediğim gibi çalışmadı. Bu sorunun en basit ve en iyi yanıtı budur.
cloudxix

12

Yalnızca gönderilecek Y'niz varsa:

$> yes Y |./your_script

Göndereceğiniz yalnızca N varsa:

$> yes N |./your_script

9

Benim durumumda bazı soruları Y veya H olmadan ancak metin veya boşlukla yanıtlamam gerekiyordu. Benim durumumda bunu yapmanın en iyi yolunun bir shellscript dosyası oluşturmak olduğunu buldum. Benim durumumda buna autocomplete.sh adını verdim

Bir doktrin şeması aktarıcısı için bazı soruları yanıtlamam gerekiyordu, bu nedenle dosyam şöyle görünüyordu.

- Bu sadece bir örnektir -

php vendor/bin/mysql-workbench-schema-export mysqlworkbenchfile.mwb ./doctrine << EOF
`#Export to Doctrine Annotation Format`                                     1
`#Would you like to change the setup configuration before exporting`        y
`#Log to console`                                                           y
`#Log file`                                                                 testing.log
`#Filename [%entity%.%extension%]`
`#Indentation [4]`
`#Use tabs [no]`
`#Eol delimeter (win, unix) [win]`
`#Backup existing file [yes]`
`#Add generator info as comment [yes]`
`#Skip plural name checking [no]`
`#Use logged storage [no]`
`#Sort tables and views [yes]`
`#Export only table categorized []`
`#Enhance many to many detection [yes]`
`#Skip many to many tables [yes]`
`#Bundle namespace []`
`#Entity namespace []`
`#Repository namespace []`
`#Use automatic repository [yes]`
`#Skip column with relation [no]`
`#Related var name format [%name%%related%]`
`#Nullable attribute (auto, always) [auto]`
`#Generated value strategy (auto, identity, sequence, table, none) [auto]`
`#Default cascade (persist, remove, detach, merge, all, refresh, ) [no]`
`#Use annotation prefix [ORM\]`
`#Skip getter and setter [no]`
`#Generate entity serialization [yes]`
`#Generate extendable entity [no]`                                          y
`#Quote identifier strategy (auto, always, none) [auto]`
`#Extends class []`
`#Property typehint [no]`
EOF

Bu strateji hakkında sevdiğim şey, cevaplarınızın ne olduğunu yorumlayabilmeniz ve EOF kullanarak boş bir satırın tam da bu olmasıdır (varsayılan cevap). Bu ihracatçı aracın bu soruları yanıtlamak için kendi JSON karşılığı olduğu ortaya çıktı, ancak bunu yaptıktan sonra bunu anladım =).

betiği çalıştırmak için sadece istediğiniz dizinde bulunun ve 'sh autocomplete.sh'terminalde çalıştırın .

Kısaca << EOL & EOF'yi Geri Dönüş Satırları ile birlikte kullanarak , istemin her sorusunu gerektiği gibi cevaplayabilirsiniz. Her yeni satır yeni bir cevaptır.

Örneğim, her adımın ne olduğunu hatırlamanız için `karakterini de kullanarak bunun yorumlarla nasıl yapılabileceğini gösteriyor.

Bu yöntemin diğer bir avantajı da sadece Y veya H'den daha fazla cevap verebilmenizdir ... aslında boşluklarla cevap verebilirsiniz!

Umarım bu birine yardım eder.


4

Bunun için özel bir yerleşik kullanım vardır - ' evet '.

Tüm soruları aynı cevapla cevaplamak için koşabilirsiniz

yes [answer] |./your_script

Ya da senaryonuzun içine koyup her soruya özel bir cevap verebilirsiniz.


bunu senaryo içinde nasıl yapabilirim? her soru için farklı yanıtlar belirtmek istiyorum
Sengo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.