Przydatne flagi: Bash

W poprzednim wpisie pokazałem kilka przydatnych flag do curla. Jednak jeżeli chcemy uruchamiać go w powłoce warto i do niej dodać kilka opcji, aby zachowanie było zgodne z intuicją.

-u

Domyślnie jeśli jakaś zmienna nie jest zdefiniowana próba odwołania się do niej zwraca pustą wartość. Nie zawsze jest to działanie zamierzone gdyż zwykła literówka może nas kosztować godziny debugowania skryptu.


#!/bin/bash

url="detektywi.it"
echo $URL

>
    

#!/bin/bash
set -u
url="detektywi.it"
echo $URL

> line 4: URL: unbound variable
    

-e

Ta flaga zapewnia, że skrypt natychmiast się zakończy jeśli któraś komenda zwróci błąd. Domyślnie jeśli coś pójdzie nie tak nasz program pójdzie dalej. Jest to dość ważne w przypadku skryptów bo w najgorszym przypadku wszystko będzie wyglądało OK a jednak jakaś część programu wykona się niepoprawnie.


#!/bin/bash

curl -X POST -f https://detektywi.it
echo OK

> curl: (22) The requested URL returned error: 406
> OK
    

#!/bin/bash
set -e
curl -X POST -f https://detektywi.it
echo OK

> curl: (22) The requested URL returned error: 406

    

-o pipefail

O ile -e przerywa skrypt po błędzie to ignoruje ona błędy podczas procesowania potoku. A to znaczy, że jeśli któryś element potoku zwróci kod różny od 0 to i tak dostaniemy kod ostatniego polecenia.


#!/bin/bash

curl -X POST -fsS https://detektywi.it | echo OK
echo $?

> OK
> curl: (22) The requested URL returned error: 406
> 0
    

#!/bin/bash
set -o pipefail
curl -X POST -fsS https://detektywi.it | echo OK
echo $?

> OK
> curl: (22) The requested URL returned error: 406
> 22
    

-x

Czasem potrzebujemy debugować nasz skrypt. Wtedy -x jest idealnym rozwiązaniem. Przed wykonaniem każda komenda zostanie wyświetlona wraz z rozwiniętymi zmiennymi. Każdy wpis debugowania dostanie prefiks + aby można go było łatwo odróżnić od wyjścia z programu.

#!/bin/bash
set -x
URL=detektywi.it
curl $URL

> + URL=detektywi.it
> + curl detektywi.it

TLDR

set -euxo pipefail


Leave a Reply