Spouštím skript, který vyžaduje zadání „y“ při každé operaci, hledám řešení jako $ ./script < echo 'yyyyyyyyyyyyyy'
předat všechny své vstupy najednou.
Nejlepší odpověď
Existuje příkaz vytvořený speciálně pro tento případ:yes
$ yes | ./script
Tím se připojí výstup yes
na vstup ./script
. Takže když ./script
požádá o vstup uživatele, místo toho dostane výstup yes
. Výstup yes
je nekonečný proud y
následuje nový řádek. Takže v podstatě jako by uživatel zadával y
pro každou otázku ./script
.
Pokud chcete říct ne (n
) místo yes (y
) můžete to udělat takto:
$ yes n | ./script
Všimněte si, že některé nástroje mají možnost vždy předpokládat yes
jako odpověď. Viz například zde:Vynechejte výzvu ano/ne v ‘apt-get upgrade’
Další způsoby zadávání vstupu:
Pokud přesně víte, kolik y
váš skript očekává, že to můžete udělat takto:
$ printf 'ynynyn' | ./script
Nové řádky (n
) jsou klávesy Enter.
Pomocí printf
místo yes
máte jemnější ovládání vstupu:
$ printf 'yesnnonmayben' | ./script
V některých vzácných případech příkaz nevyžaduje, aby uživatel po znaku stiskl klávesu Enter. v tom případě vynechejte nové řádky:
$ printf 'yyy' | ./script
Pro úplnost můžete také použít dokument zde:
$ ./script << EOF
y
y
y
EOF
Nebo pokud to váš shell podporuje, řetězec zde:
$ ./script <<< "y
y
y
"
Nebo můžete vytvořit soubor s jedním vstupem na řádek:
$ ./script < inputfile
Pokud je příkaz dostatečně složitý a výše uvedené metody již nestačí, můžete použít očekávat.
Zde je příklad super jednoduchého očekávaného skriptu:
spawn ./script
expect "are you sure?"
send "yesr"
expect "are you really sure?"
send "YES!r"
expect eof
Technický hnidopich:
Hypotetické vyvolání příkazu, které jste uvedli ve své otázce, nefunguje:
$ ./script < echo 'yyyyyyyyyyyyyy'
bash: echo: No such file or directory
Je to proto, že gramatika shellu umožňuje operátor přesměrování kdekoli v příkazovém řádku. Pokud jde o shell, váš hypotetický příkazový řádek je stejný jako tento řádek:
$ ./script 'yyyyyyyyyyyyyy' < echo
bash: echo: No such file or directory
To znamená ./script
bude voláno s argumentem 'yyyyyyyyyyyyyy'
a stdin dostane vstup ze souboru s názvem echo
. A bash si stěžuje, protože soubor neexistuje.