Strona 1 z 1

bash i potoki

: 04 października 2017, 12:07
autor: aksnet
mam plik z danymi np. data.txt i skrypt format.sh

formatowanie danych uruchamiam tak:

Kod: Zaznacz cały

./data.txt | format.sh
skrypt format.sh czyta linia po linii plik data.sh przetwarza go
np. w pętli

Kod: Zaznacz cały

while read line; do
    echo $line
    ...
done
czy po zakończeniu takiej pętli w skrypcie
jest jakaś możliwość czytania potoku znów od początku?

Re: bash i potoki

: 04 października 2017, 13:44
autor: dedito
Jak najbardziej, ta składnia wywołania jakaś dziwna.
Czemu w samym skrypcie nie zaciągasz tego pliku do formatowania?

Re: bash i potoki

: 04 października 2017, 14:09
autor: aksnet
Ty chyba powinno być oczywiste.

Po to żeby skrypt format.sh uruchomić dla dowolnego pliku
bez niepotrzebnego edytowania format.sh

Re: bash i potoki

: 04 października 2017, 14:14
autor: lizard
Możesz podać plik z danymi jako parametr skryptu "format.sh data.txt" i odwoływać się do niego:

Kod: Zaznacz cały

InData="${1}"
while read Line; do
  echo "${Line}"
done < "${InData}"
Możesz też czytać ze standardowego wejścia, jak do tej pory, a wszystko, co odczytasz zapisywać do pliku tymczasowego i sięgać, gdy zajdzie taka potrzeba:

Kod: Zaznacz cały

TmpFile="$(mktemp /tmp/format.sh-XXXX)"
> "${TmpFile}"
while read Line; do
  echo "${Line}" >> "${TmpFile}"
  :
done

while read Line; do
  echo "${Line}"
done < "${TmpFile}"
:
rm -f "${TmpFile}"
:
Ciekawy pomysł na wielokrotne wykorzystanie w pętli ostatnio odczytanej linii jest ns Stack Overflow:

Kod: Zaznacz cały

recycle=false
some_command | while $recycle || read line
do
  if something then
    read line
    recycle=false
  else
    # how do I "unread"?
    recycle=true
  fi
done

Re: bash i potoki

: 04 października 2017, 14:22
autor: dedito
aksnet pisze: 04 października 2017, 14:09 Ty chyba powinno być oczywiste.

Po to żeby skrypt format.sh uruchomić dla dowolnego pliku
bez niepotrzebnego edytowania format.sh
Oczywiste to by było gdybyś wywoływał jak to @Lizard pokazał na przykładzie wywołania argumentu $1