Obecnie badam pakiety Debiana i czytam kilka przykładów kodu. Na przykład w każdym wierszu postinst
skryptu jest wzorzec.
some command || true
another command || true
Więc jeśli jakieś polecenie się nie powiedzie, wówczas linia zwraca true, ale nie widzę, jak wpływa to na wynik programu.
shell-script
error-handling
Cieśla
źródło
źródło
||:
to kolejny idiomatyczny sposób pisania tego (:
jest to kolejny wpis we wbudowanej tabeli wskazujący natrue
- ale gwarantowany, że jest wbudowany nawet z powrotem do Bourne; to powiedziawszy, dla POSIX shtrue
również jest zagwarantowane, że jest wbudowany - więc jest to więcej zwięzłości niż wydajności w czasach nawet współczesnych).Odpowiedzi:
Przyczyną tego wzorca jest to, że skrypty opiekuna w pakietach Debiana zwykle zaczynają się od
set -e
, co powoduje, że powłoka kończy działanie, gdy tylko dowolne polecenie (ściśle mówiąc, potok, lista lub polecenie złożone) ma status niezerowy. Dzięki temu błędy się nie kumulują: gdy tylko coś pójdzie nie tak, skrypt przerywa działanie.W przypadkach, gdy wykonanie polecenia w skrypcie może się nie powieść, dodanie
|| true
powoduje, że wynikowe polecenie złożone zawsze kończy działanie ze statusem zero, więc skrypt nie przerywa działania. Na przykład usunięcie katalogu nie powinno być krytycznym błędem (uniemożliwiającym usunięcie pakietu); więc skorzystalibyśmyponieważ
rmdir
nie ma opcji, aby ignorować błędy.źródło
set -e
potrzeby|| true
, pomyślałem, że ważne jest podanie kontekstu. Jeśli zauważysz dziwne rzeczy na POWER, gorąco zachęcam do zgłaszania błędów (reportbug
)!set -e
jest nie tylko „konwencją Debiana”, ale dobrym wzorcem programowania, którego należy zawsze używać. Widzieć. np davidpashley.com/articles/writing-robust-shell-scripts|| true
zestawu -e jest prawdopodobnym kontekstem i najprawdopodobniej najczęstszym. Kłaniam się tej odpowiedzi! Dosłownie jest to przydatne, gdy status wyjścia jest uważany za nieistotny ORAZ (jak dodajesz link do artykułu) Nie używam statusu wyjścia jako części mojej kontroli skryptu. Widzę narzędzie (wset -e
), ale nie posunęłoby się tak daleko, jak artykuł i powiedział: „Każdy skrypt, który piszesz, powinien zawierać zestaw -e na górze”. To styl programowania. „ZAWSZE | Każdy” zawiera własny zestaw pułapek - aka - absolut absolutny: rozwiązania z dziką kartą wALWAYS
końcu zwrócą się aka - żadnych bezpłatnych przejazdów.set -e
zachowaniem. Może to nie mieć znaczenia, jeśli twoim jedynym celem sąbash
inne, względnie nowe powłoki, w których żyjesz/bin/sh
, ale sytuacja jest bardziej niuansowa, gdy chcesz obsługiwać stare powłoki / systemy.set -e
zachowania muszli autorstwa Svena Maschecka , choć strona ta dokumentuje również wiele historycznych / starożytnych powłok, które nie mają dziś znaczenia. Są też te dwie strony o węższym, nowoczesnym wydaniu (wyszukaj „set -e”): strona „lintsh” , dokumentacja przenośnej powłoki autoconf -> podstrona Ograniczenie wbudowanychChociaż nie wpływa to na wynik działania programu, po prostu uruchom - pozwala wywołującemu kontynuować działanie, jakby wszystko było w porządku, inaczej wpływa na przyszłą logikę.
Przeformułowano: maskuje status błędu poprzedniego polecenia.
źródło
set -e
a|| true
użyteczność zostanie określona przez cechy i cele programistagit remote remove foo || true
git remote add foo http://blah
- chcemy zignorować błąd, jeśli pilot nie istnieje.