Ho bisogno di eseguire un numero di comandi shell convogliati da uno script non BASH (vale a dire script PHP) come questi:
command1 | command2 | command3
in modo che, se command1
fallisce con un codice di uscita diverso da zero, anche l'altro comando fallisce. Finora, quello che ho escogitato è:
set -o pipefail && command1 | command2 | command3
Ma anche se funziona bene dal terminale, produce questo se eseguito dallo script:
sh: 1: set: opzione illegale -o pipefail
/bin/sh set -o pipefail
dice /bin/sh: 0: Can't open set
(stessa cosa con sudo
). Spero di averlo provato bene. Il sistema è Ubuntu 12.
/bin/sh -c "set -o pipefail"
; com'era, la shell stava cercando di eseguire uno script nella directory corrente chiamata set
e non l'ha trovata.
/bin/sh -c "set -o pipefail"
non funziona, tuttavia bash -c "set -o pipefail"
funziona.
/bin/sh
che non riconosce set -o pipefail
. Di conseguenza, dovrai assicurarti che lo script sia eseguito al /bin/bash
posto di /bin/sh
. Oppure, se sei sicuro, coraggioso - e probabilmente insensato - cambia /bin/sh
per essere un link o una copia di, /bin/bash
invece di qualunque shell a cui è attualmente collegato o una copia di. Se sei sicuro che lo /bin/sh
sia bash
, allora stai usando un comportamento che bash
non espone quando eseguito come /bin/sh
; usa bash
come bash
.
/bin/sh
non mi piaceset -o pipefail
. In realtà èbash
sotto mentite spoglie o è un guscio diverso? Quandobash
viene eseguito come/bin/sh
, accettaset -o pipefail
?