Como a saída é gerada antes que o status de saída seja conhecido, você precisará armazená-la em algum lugar.
Uma possibilidade é armazená-lo em uma variável de shell:
output=$(php /path/to/script.php)
if [ $? -ne 0 ]; then
printf "%s\n" "$output"
fi
Isso não preserva completamente a saída do script (remove as linhas em branco à direita), mas tudo bem para este caso de uso. Se você deseja preservar as linhas em branco à direita:
output=$(php /path/to/script.php; ret=$?; echo a; exit $ret)
if [ $? -ne 0 ]; then
printf "%s" "${output%a}"
fi
Se houver potencialmente muita saída, você pode preferir armazená-la em um arquivo temporário:
output_file=$(mktemp /var/tmp/script.XXXXXXXXXX.out)
php /path/to/script.php >>"$output_file"
ret=$?
if [ $ret -ne 0 ]; then
echo "script.php failed (status $ret), see the output in $output_file"
fi