Ciao a tutti.
Ho recentemente scoperto che, in bash, un ciclo alimentato da una pipe viene
eseguito in un sottoprocesso. Dico "scoperto" perché la mia esperienza
deriva da Unix System V.
Questo comportamento ha come conseguenza che il valore delle variabili
modificate all' _interno_ del ciclo non viene propagato all' _esterno_.
Riporto lo snippet per riferimento:
#!/bin/bash
num=0 endtot=0 lentot=0
# script.awk restituisce numero di riga di inizio e fine # di ogni blocco dati in $1 # In poche parole, l'ambaradan riorganizza i blocchi di dati in $1, # riconoscendo quando più blocchi sono consecutivi e quindi non # necessitano di essere trattati singolarmente. script.awk $1 | sort -ns | while read line; do let ++num start=$(echo "$line" | cut -f 3) end=$(echo "$line" | cut -f 4) len=$(echo "$line" | cut -f 5) if [ $start -eq $(($endtot + 1)) ]; then endtot=$end let 'lentot += len' else head -n $endtot $1 | tail -n $lentot >> $2 endtot=$end lentot=$len fi echo -e "$endtot\t$lentot" > tmp.$$ done # A questo punto, $endtot e $lentot valgono sempre 0! # Per ora, me la sono cavata così. # MA E' UNA SOLUZIONE VERAMENTE TROPPO BECERA, direi proprio un TAPULLO!!! endtot=$(cat tmp.$$ | cut -f 1) lentot=$(cat tmp.$$ | cut -f 2) rm -f tmp.$$ head -n $endtot $1 | tail -n $lentot >> $2