Mam skrypt, który analizuje nazwy plików w tablicy przy użyciu następującej metody wziętej z pytań i odpowiedzi na temat SO :
unset ARGS
ARGID="1"
while IFS= read -r -d $'\0' FILE; do
ARGS[ARGID++]="$FILE"
done < <(find "$@" -type f -name '*.txt' -print0)
Działa to świetnie i doskonale radzi sobie ze wszystkimi odmianami nazw plików. Czasami jednak przekażę nieistniejący plik do skryptu, np .:
$ findscript.sh existingfolder nonexistingfolder
find: `nonexistingfile': No such file or directory
...
W normalnych okolicznościach skrypt powinien przechwycić kod wyjścia za pomocą czegoś podobnego RET=$?
i użyć go, aby zdecydować, jak kontynuować. Nie wydaje się, aby działało to z powyższym podstawieniem procesu.
Jaka jest poprawna procedura w takich przypadkach? Jak mogę przechwycić kod powrotu? Czy istnieją inne bardziej odpowiednie sposoby ustalenia, czy coś poszło nie tak w zastępowanym procesie?
źródło
Użyj koprocesu . Za pomocą
coproc
wbudowanego programu możesz uruchomić podproces, odczytać jego dane wyjściowe i sprawdzić status wyjścia:Jeśli katalog nie istnieje,
wait
zakończy działanie z niezerowym kodem stanu.Obecnie konieczne jest skopiowanie PID do innej zmiennej, ponieważ
$LS_PID
zostanie ona rozbrojona przedwait
wywołaniem. Zobacz Bash unsets * _PID zmienną, zanim będę mógł czekać na coproc, aby uzyskać szczegółowe informacje.źródło
read -u
powinien równie dobrze działać. Przykład miał być ogólny i pokazywać, w jaki sposób dane wyjściowe koprocesu mogą być przesyłane do innego polecenia.Jednym z podejść jest:
Chodzi o to, aby po zakończeniu polecenia powtórzyć status wyjścia wraz z losowym tokenem, a następnie użyć wyrażeń regularnych bash, aby wyszukać i wyodrębnić status wyjścia. Token służy do utworzenia unikatowego ciągu, którego należy szukać w danych wyjściowych.
Prawdopodobnie nie jest to najlepszy sposób na zrobienie tego w ogólnym znaczeniu programistycznym, ale może to być najmniej bolesny sposób radzenia sobie z nim w trybie bash.
źródło