Chciałbym móc utworzyć funkcję bash, która może odczytać kod wyjścia polecenia przed potokiem. Nie jestem pewien, czy jest możliwy dostęp do tego.
echo "1" | grep 2
zwraca 1 kod statusuecho "1" | grep 1
zwraca kod stanu 0
Teraz chciałbym dodać trzecią komendę do odczytania statusu za pomocą potoku:
echo "1" | grep 2 | echo $?
będzie echo „0”, nawet jeśli kod statusu to 1.
Wiem, że mogę użyć echo "1" | grep 2 && echo "0" || echo "1"
, ale wolałbym napisać to za pomocą fajki.
Czy i tak mają to zrobić (byłoby nawet lepiej, gdyby działał na większości powłok, takich jak bash, sh i zsh)
Odpowiedzi:
3 dla odpowiedzi № 1Będziesz musiał uzyskać status wyjścia przed następny etap rurociągu. Coś jak
exec 3> debug.txt
{ echo "1"; echo "$?" >&3; } | long | command | here
Możesz „t (łatwo) hermetyzować to w funkcji, ponieważ wymagałoby to podania poprawnie cytowanego ciągu i wykonania go przez eval
:
debug () {
eval "$@"
echo $? >&3
}
# It looks easy in this example, but it won"t take long to find
# an example that breaks it.
debug echo 1 | long | command | here
Musisz napisać kod wyjścia do innego deskryptora pliku, w przeciwnym razie będzie on zakłócał wyjście wysyłane do następnego polecenia w potoku.
1 dla odpowiedzi nr 2
W bash możesz to zrobić za pomocą PIPESTATUS
zmienna
echo "1" | grep 1
echo ${PIPESTATUS[0]} # returns 0
echo "1" | grep 2
echo ${PIPESTATUS[0]} # returns 0
echo "1" | grep 2
echo ${PIPESTATUS[1]} # returns 1