GNU/Linux >> Znalost Linux >  >> Linux

Automatizace textového vstupu z bash skriptu bez použití EOF

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.


Linux
  1. Potrubí do/ze schránky ve skriptu Bash

  2. Přesměrujte standardní vstup dynamicky v bash skriptu

  3. Bash skript:Použití příkazu script z bash skriptu pro protokolování relace

  1. Automatizace spouštění příkazů na Linuxu z Windows pomocí PuTTY

  2. Přeneste soubory pomocí lftp v bash skriptu

  3. Obnovení ~/.bashrc bez použití příkazů bash

  1. Bash skript k odstranění nejstaršího souboru ze složky?

  2. Získat úplnou cestu ze skriptu Bash?

  3. Je Rsync ~/foo Target/foo stejný jako Rsync ~/foo/ Target/foo/?