/ / Uzyskaj kod wyjścia z ostatniego potoku (stdin) - bash, kod wyjścia

Uzyskaj kod wyjścia z ostatniego potoku (stdin) - bash, kod wyjścia

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 statusu
  • echo "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 № 1

Bę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