Pro téměř všechny programy, oba echo $i | myprogram -options
a myprogram -options <<<$i
by měl fungovat, a to tak, že do programu přidáte $i
prostřednictvím standardního vstupu.
<foo
použije obsah souboru s názvem foo
jako stdin.
<<foo
použije text mezi tímto a řádkem tvořeným výhradně foo
jako standardní vstup. Toto je dokument zde (heredoc), jak řekl Gilles; EOF
ve skutečnosti neznamená konec souboru, je to jen běžný vymezovač heredoc (v tomto příkladu místo toho používáme „foo“).
<<<foo
použije řetězec "foo" jako standardní vstup. Můžete také zadat proměnnou $foo
a shell použije svůj obsah jako stdin, jak jsem ukázal výše. Toto se nazývá herestring , protože používá krátký řetězec na rozdíl od celého bloku, jako v heredoc. Herestrings fungují v bash, ale ne v /bin/sh
.
Syntaxe doporučená tímto webem se nazývá dokument zde. Vstup do souborového programu začíná bezprostředně pod řádkem obsahujícím <<EOF
a není ukončen koncem skriptu, ale řádkem obsahujícím přesně text EOF
(dejte pozor, abyste neměli mezery navíc). Mimochodem, můžete použít libovolnou koncovou značku, která neobsahuje žádný speciální znak shellu:EOF
není klíčové slovo, je pouze tradiční.
#!/bin/bash
for i in {1..100}
do
myprogram -options <<EOF
$i
EOF
for j in {1..42}; do
myprogram2 <<EOF
$i
$j
EOF
done
done
zde dokumenty, jak je zmíněno výše Kevinem a Gillesem, nebo jednoduché potrubí bude v mnoha případech fungovat.
V případě složitějších situací se můžete podívat na Expect nebo podobné (např. modul Expect::Simple CPAN je velmi snadno použitelná implementace perlu). osobně preferuji modul perl (samotný Expect je tcl), ale existují implementace pro mnoho běžných skriptovacích jazyků. Je dokonce možné napsat velmi primitivní implementace myšlenky v sh nebo bash pomocí while a read.
Obecnou myšlenkou nástrojů Expect a podobných nástrojů je počkat na zadaný řetězec nebo vzor ve výstupu programu a poté jej přivést na libovolný vstup.
Běžným příkladem použití je automatizace přihlášení „očekáváním“ (tj. čekáním na) řetězce „ogin:“, odesláním přihlašovacího jména, následným očekáváním řetězce „word:“ a odesláním hesla.
Jednou z posledních možností, pokud máte zdroj myprogramu, je upravit jej tak, aby vstup, který mu chcete zadat, převzal jako volbu příkazového řádku. To může být trochu více práce předem, ale bude to mnohem méně přitěžující, než si pohrávat s Expect nebo předávat data do programu, který nebyl navržen pro použití tímto způsobem.
... a nezapomeňte odeslat svůj patch do myprogramu zpět proti proudu :) I když se jim nelíbí způsob, jakým jste jej nakódovali, mohl by se jim tento nápad líbit natolik, že by si funkci přidali sami. Upstream vývojáři mají tendenci ocenit lidi, kteří se vyřádí a přispívají, spíše než aby požadovali nebo si stěžovali.