Niech skrypt bash odpowiada na interaktywne monity [duplikat]


109

Czy jest możliwe, aby skrypt bash automatycznie obsługiwał podpowiedzi, które normalnie byłyby przedstawiane użytkownikowi z domyślnymi akcjami? Obecnie używam skryptu bash, aby wywołać wewnętrzne narzędzie, które wyświetli użytkownikowi podpowiedzi (monitujące o T / N) w celu wykonania czynności, jednak skrypt, który piszę, musi być całkowicie „bezobsługowy”, więc Potrzebuję sposobu, aby wysłać Y|Ndo monitu, aby umożliwić kontynuowanie wykonywania programu. czy to możliwe?


to nie jest „autouzupełnianie”… jak mówi @unwind, to „automatyzacja”
benzaita

3
Przykład użycia yesdo tego: unix.stackexchange.com/questions/47344/ ...
Droogans

Odpowiedzi:


65

To nie jest „autouzupełnianie”, to jest automatyzacja. Jednym z powszechnych narzędzi do tych rzeczy jest oczekiwanie .

Możesz również ujść na sucho, używając tylko wejścia potokowego z yes.


3
Niestety nie mogę użyć funkcji oczekuj, ponieważ ich wymagania dotyczące miejsca w systemie, na którym to działa, są surowe, więc nie mogę dodać dodatkowych pakietów, ale piping yeszałatwił sprawę, na szczęście wszystkie monity i tak wymagały tylko `` y ''. Dzięki.
TJ L

Jednak Yes | commandmoże nie zawsze działać. Jeśli jest to tylko do celów instalacyjnych, skorzystałem -yz lepszej i preferowanej opcji.
Umesh Kaushik

169

Prosty

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

Pozwala to na przekazanie do skryptu dowolnej sekwencji „Y” lub „N”.


3
Gdybym musiał wysłać jakieś N, użyłbym tej metody, ale potrzebowałem tylko Y, więc poszedłem z yes. Szkoda, że ​​nie mogę przyjąć dwóch odpowiedzi, ponieważ obie są poprawne.
TJ L

3
;) Cóż, jeśli kiedykolwiek będziesz musiał wysłać kilka N, teraz masz dobry sposób, aby to zrobić.
Loïc Février

2
To nie działa dla mnie; spacje nie liczą się jako nowe wiersze --- jeśli na przykład powtórzę "T N", wówczas podaje łańcuch "Y N"jako wejście do pierwszej zachęty i zawiesza się w drugiej, czekając na jej zakończenie. Próbowałem zmienić spacje na znaki nowej linii, ale to też nie zadziałało, nadal podawałem dosłowny ciąg do zachęty.
temporary_user_name

52
spróbuj użyć printf 'y\ny\ny\n' | ./your_script. W ten sposób ręcznie wstawiasz nową linię dla każdego oczekiwanego wpisu.
Majid

8
printf '%s\n' Y Y N N Y N Y Y Numieszcza znaki nowej linii między elementami, ale bez potrzeby jednego łańcucha dużego formatu.
Charles Duffy

16

Odkryłem, że najlepszym sposobem wysyłania danych wejściowych jest użycie kota i pliku tekstowego, aby przekazać potrzebne dane wejściowe.

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

Oczekiwanie nie działało zgodnie z oczekiwaniami dla mnie. To najprostsza i najlepsza odpowiedź na to pytanie.
cloudxix

12

Jeśli masz tylko Y do wysłania:

$> yes Y |./your_script

Jeśli masz tylko N do wysłania:

$> yes N |./your_script

9

W mojej sytuacji musiałem odpowiedzieć na kilka pytań bez T lub N, ale z tekstem lub puste. W mojej sytuacji najlepszym sposobem na zrobienie tego jest utworzenie pliku skryptu powłoki. W moim przypadku nazwałem to autocomplete.sh

Musiałem odpowiedzieć na kilka pytań dotyczących eksportera schematu doktryny, więc mój plik wyglądał tak.

- To jest tylko przykład -

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

To, co mi się podoba w tej strategii, to to, że możesz komentować swoje odpowiedzi, a używając EOF pusta linia jest po prostu taka (domyślna odpowiedź). Okazuje się, że to narzędzie eksportera ma swój własny odpowiednik JSON do odpowiedzi na te pytania, ale doszedłem do tego po tym, jak to zrobiłem =).

aby uruchomić skrypt, po prostu znajdź się w wybranym katalogu i uruchom 'sh autocomplete.sh'w terminalu.

Krótko mówiąc, używając << EOL i EOF w połączeniu z liniami zwrotnymi możesz odpowiedzieć na każde pytanie monitu, jeśli to konieczne. Każdy nowy wiersz to nowa odpowiedź.

Mój przykład pokazuje tylko, jak można to zrobić za pomocą komentarzy, również używając znaku `, abyś pamiętał, czym jest każdy krok.

Zwróć uwagę, że inną zaletą tej metody jest to, że możesz odpowiedzieć, używając więcej niż tylko T lub N ... w rzeczywistości możesz odpowiedzieć spacjami!

Mam nadzieję, że to komuś pomoże.


4

Jest do tego specjalne narzędzie wbudowane - „ tak ”.

Aby odpowiedzieć na wszystkie pytania tą samą odpowiedzią, możesz uruchomić

yes [answer] |./your_script

Lub możesz umieścić go w swoim skrypcie, aby uzyskać konkretną odpowiedź na każde pytanie


jak mogę to zrobić w skrypcie? mam na myśli określenie różnych odpowiedzi na każde pytanie
Sengo
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.