Muszę wykonać szereg potokowych poleceń powłoki ze skryptu innego niż BASH (a mianowicie skryptu PHP), takiego jak te:
command1 | command2 | command3
tak, że jeśli command1nie powiedzie się niezerowy kod wyjścia, każde inne polecenie również zawiedzie. Do tej pory wymyśliłem:
set -o pipefail && command1 | command2 | command3
Ale mimo że działa poprawnie z terminala, generuje to, jeśli jest wykonywany ze skryptu:
sh: 1: set: Niedozwolona opcja -o pipefail
/bin/sh set -o pipefail, mówi /bin/sh: 0: Can't open set(to samo z sudo). Mam nadzieję, że dobrze to przetestowałem. System to Ubuntu 12.
/bin/sh -c "set -o pipefail"; tak jak było, powłoka próbowała wykonać skrypt w bieżącym katalogu o nazwie seti nie znalazł go.
/bin/sh -c "set -o pipefail"nie działa, jednak bash -c "set -o pipefail"działa.
/bin/shktóry nie rozpoznaje set -o pipefail. W związku z tym musisz upewnić się, że skrypt jest uruchamiany /bin/bashzamiast /bin/sh. Lub, jeśli jesteś pewny siebie, odważny - i prawdopodobnie nierozsądny - zmień /bin/shsię na link do lub kopię /bin/bashzamiast na jakąkolwiek powłokę, z którą jest obecnie połączona lub kopię. Jeśli masz pewność, że /bin/shjest bash, to używasz zachowania, które bashnie narażają gdy uruchamiane jako /bin/sh; użyj bashjako bash.
/bin/shsię nie podobaset -o pipefail. Czy to rzeczywiściebashw przebraniu, czy może to inna skorupa? Kiedybashjest uruchamiany jako/bin/sh, czy akceptujeset -o pipefail?