Korzystam ze skryptu, który żąda wpisania „y” przy każdej operacji, szukam rozwiązania takiego jak $ ./script < echo 'yyyyyyyyyyyyyy'
przekazywanie wszystkich danych wejściowych za jednym razem.
command-line
input
NewMrd
źródło
źródło
-f
opcja działa dobrze z niektórymi poleceniami.Odpowiedzi:
Istnieje specjalnie utworzone polecenie dla tego przypadku:
yes
To robi to podłączyć wyjście
yes
do wejścia./script
. Więc kiedy./script
poprosi o dane wejściowe użytkownika, zamiast tego otrzyma wynikyes
. Wynikiemyes
jest niekończący się strumień,y
po którym następuje nowa linia. Zasadniczo tak, jakby użytkownik wpisały
każde pytanie./script
.Jeśli chcesz powiedzieć nie (
n
) zamiast tak (y
), możesz to zrobić w następujący sposób:Pamiętaj, że niektóre narzędzia mają opcję, aby zawsze przyjmować
yes
jako odpowiedź. Zobacz tutaj na przykład: Ominięcie monitu o tak / nie w 'apt-get upgrade'Inne metody wprowadzania danych wejściowych:
Jeśli wiesz dokładnie, ile
y
oczekuje Twój skrypt, możesz to zrobić w następujący sposób:Nowe linie (
\n
) to klawisze Enter.Używanie
printf
zamiastyes
ciebie ma bardziej precyzyjną kontrolę wejścia:Zauważ, że w niektórych rzadkich przypadkach polecenie nie wymaga od użytkownika naciśnięcia klawisza Enter po znaku. w takim przypadku pozostaw nowe linie:
Dla zachowania kompletności możesz również skorzystać z dokumentu tutaj :
Lub jeśli twoja powłoka obsługuje to ciąg tutaj :
Lub możesz utworzyć plik z jednym wejściem w wierszu:
Jeśli polecenie jest wystarczająco złożone, a powyższe metody już nie wystarczają, możesz użyć metody expect .
Oto przykład bardzo prostego skryptu oczekiwanego:
Techniczny nitpick:
Hipotetyczne wywołanie polecenia podane w pytaniu nie działa:
Jest tak, ponieważ gramatyka powłoki pozwala operatorowi przekierowania w dowolnym miejscu wiersza poleceń. Jeśli chodzi o powłokę, twoja hipotetyczna linia poleceń jest taka sama jak ta linia:
Oznacza to,
./script
że zostanie wywołany z argumentem,'yyyyyyyyyyyyyy'
a standardowe wejście otrzyma dane wejściowe z pliku o nazwieecho
. I bash narzeka, ponieważ plik nie istnieje.źródło
cannot enable tty mode on non tty input
. Czy znasz to obejście?printf
podstępu zrun
plikiem, który muszę zautomatyzować proces instalacji, wszystko, co się dzieje, to pojawia się komunikat o błędzieWarning: Tried to connect to session manager, None of the authentication protocols specified are supported
, a skrypt otwiera się w nowym terminalu i prosi mnie o ręczne wprowadzenie danych jak zwykle. Nawiasem mówiąc, dzieje się to na Debianie. Jakieś sugestie?Użyj polecenia
yes
:Fragment strony man:
źródło
Niektóre rzeczy (
apt-get
na przykład) akceptują specjalne flagi do działania w trybie cichym (i akceptują wartości domyślne). W takimapt-get
przypadku po prostu podajesz mu-y
flagę. Zależy to jednak całkowicie od twojego skryptu.Jeśli potrzebujesz bardziej skomplikowanych rzeczy, możesz owinąć swój skrypt skryptem oczekiwanym. Oczekiwanie pozwala odczytać dane wyjściowe i wysłać dane wejściowe, dzięki czemu można wykonywać dość skomplikowane czynności, na które nie pozwalałoby inne skrypty. Oto jeden z przykładów ze strony Wikipedii :
źródło
.sh
skryptem powłoki, prawda? Czy jest jakiś sposób?W skrypcie powłoki możesz także użyć następującej sztuczki spawnowania, oczekiwania i wysyłania
Jednak w powyższym scenariuszu będziesz musiał podać frazę, której oczekujesz podczas wykonywania skryptu, aby uzyskać więcej przykładów, przejdź do następującego linku
Spodziewaj się w Bash
źródło
Ok, to może nie być bardzo eleganckie rozwiązanie, ale jeśli napiszesz opcje w osobnym pliku, a następnie przekażesz je jako dane wejściowe do skryptu, to również zadziała. Jeśli więc utworzysz nowy plik ze wszystkimi opcjami (nazwij ten plik jako „options.in”), możesz łatwo uruchomić skrypt
./script.sh < options.in
i edytować / tworzyć różne pliki opcji odpowiednio.źródło
options.in
plik? Czy możesz podać przykład?Pisałem skrypt bash w Dialogu i potrzebowałem, aby stało się to również automatycznie. Zrobiłem to i zadziałało jak urok.
źródło
Możesz podać dane wejściowe użytkownika do skryptu za
cat
pomocą pliku tekstowego przesyłanego strumieniowo do skryptu wbash
następujący sposób:Po prostu umieść żądane dane wejściowe użytkownika w pliku input.txt, niezależnie od potrzebnych odpowiedzi - y, n, cyfry, ciągi itp.
źródło