A determinação é difícil, pois muitos processos usam o mesmo valor.
% ssh 2>/dev/null localhost 'exit 255' ; echo $?
255
% ssh 2>/dev/null nopelocalhost 'exit 0' ; echo $?
255
Com uma heurística, você poderia adivinhar qual código é de qual programa baseado em códigos de saída comumente usados; isso seria mais correto, a menos que os programas envolvidos se sobreponham ou algo inesperado aconteça. Erro padrão pode ou não estar disponível e o código de saída pode mudar dependendo de como o programa sai:
% ssh localhost ./segfault ; echo $?
255
% ./segfault ; echo $?
zsh: bus error ./segfault
138
%
Assim, não é tão confiável adivinhar de onde veio $?
. Em vez disso, uma opção melhor pode ser projetar um protocolo que comunique mais informações do que as fornecidas pela palavra de status de saída; exemplos incluem Nagios ou Ansible que comunicam mais do que apenas $?
ao determinar como um comando remoto foi executado. Isso pode ser tão simples quanto uma linha de texto que depende de como smartctl
foi executada (ou segfaulted, ou ...) ou algo mais complicado como uma estrutura JSON com a saída padrão, err, status de saída e outros metadados . Portanto, em vez de executar smartctl
diretamente, você chamaria o programa wrapper que executa smartctl
e analisa sua saída e, do outro lado de ssh
, coletaria essa saída; se a saída não estiver disponível, algo deu errado com o ssh
ou com o programa wrapper.