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 command1
nie 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 set
i nie znalazł go.
/bin/sh -c "set -o pipefail"
nie działa, jednak bash -c "set -o pipefail"
działa.
/bin/sh
który nie rozpoznaje set -o pipefail
. W związku z tym musisz upewnić się, że skrypt jest uruchamiany /bin/bash
zamiast /bin/sh
. Lub, jeśli jesteś pewny siebie, odważny - i prawdopodobnie nierozsądny - zmień /bin/sh
się na link do lub kopię /bin/bash
zamiast na jakąkolwiek powłokę, z którą jest obecnie połączona lub kopię. Jeśli masz pewność, że /bin/sh
jest bash
, to używasz zachowania, które bash
nie narażają gdy uruchamiane jako /bin/sh
; użyj bash
jako bash
.
/bin/sh
się nie podobaset -o pipefail
. Czy to rzeczywiściebash
w przebraniu, czy może to inna skorupa? Kiedybash
jest uruchamiany jako/bin/sh
, czy akceptujeset -o pipefail
?