Jak zaimplementować 'set -o pipefail' w sposób POSIX - prawie gotowe, potrzebna jest pomoc eksperta
Muszę zaimplementować opcję BASH „set -o pipefail” w sposób POSIX, aby działała na różnych odmianach LINUX / UNIX. Aby wyjaśnić trochę, opcja ta umożliwia użytkownikowi weryfikację pomyślnego wykonania wszystkich poleceń potokowych. Po włączeniu tej opcji polecenie cat app.log | grep 'ERROR' nie powiedzie się, jeśli zawiedzie 'cat', w przeciwnym razie błąd 'cat' zostanie pominięty.
Więc znalazłem naprawdę fajne rozwiązanie:http://cfaj.ca/shell/cus-faq-2.html
run() {
j=1
while eval "\${pipestatus_$j+:} false"; do
unset pipestatus_$j
j=$(($j+1))
done
j=1 com= k=1 l=
for a; do
if [ "x$a" = 'x|' ]; then
com="$com { $l "'3>&-
echo "pipestatus_'$j'=$?" >&3
} 4>&- |'
j=$(($j+1)) l=
else
l="$l \"\$k\""
fi
k=$(($k+1))
done
com="$com $l"' 3>&- >&4 4>&-
echo "pipestatus_'$j'=$?"'
exec 4>&1
eval "$(exec 3>&1; eval "$com")"
exec 4>&-
j=1
while eval "\${pipestatus_$j+:} false"; do
eval "[ \$pipestatus_$j -eq 0 ]" || return 1
j=$(($j+1))
done
return 0
}
Wyżej wymieniona funkcja run () umożliwia użytkownikowi wywołanie potokowych poleceń w taki sposób: uruchomcmd1 \| cmd2 \| cmd3
Jeśli jedno z poleceń zawiedzie, otrzymasz je w $?
Istnieje jednak problem, nie obsługuje grupowania poleceń między rurami. Chcę móc wywołać coś takiego:
run echo "test" ; grep "test" \| awk '{print}'
Kiedy to robię, wywołanie nie powiedzie się. Nie mogę uzyskać odpowiedniej modyfikacji, aby obsługiwać grupowanie poleceń - skrypt jest trochę zbyt skomplikowany dla moich umiejętności basha ... Czy ktoś może pomóc?
Dzięki!
Istnieje definicja funkcji run (), która umożliwia użytkownikowi uruchamianie potokowych poleceń w taki sposób: