Quero que meus scripts de shell falhem sempre que um comando executado com eles falhar.
Normalmente faço isso com:
set -e
set -o pipefail
(normalmente eu adiciono set -u
também)
O fato é que nenhuma das opções acima funciona com substituição de processo. Este código imprime "ok" e sai com o código de retorno = 0, enquanto eu gostaria que falhasse:
#!/bin/bash -e
set -o pipefail
cat <(false) <(echo ok)
Existe algo equivalente a "pipefail", exceto para substituição de processo? Qualquer outra maneira de passar para um comando a saída dos comandos como se fossem arquivos, mas gerando um erro sempre que algum desses programas falha?
A solução do homem pobre seria detectar se esses comandos gravam no stderr (mas alguns comandos gravam no stderr em cenários de sucesso).
Outra solução mais compatível com posix seria usar pipes nomeados, mas eu preciso usar esses comandos que usam substituição de processo como oneliners criados em tempo real a partir de código compilado, e a criação de pipes nomeados complicaria as coisas (comandos extras, erro de interceptação para excluí-los etc.)
$$
substituição não funciona para mim, pois essa substituição de comando não é feita, pois o comando que usa substituição de processo é feito dentro de um pipeline de comando gerado a partir de um código "não shell" (python). Provavelmente eu deveria criar subprocessos em python e canalizá-los programaticamente.
kill -2 0
.
mkfifo pipe; { rm pipe; cat <file; } >pipe
. Esse comando será interrompido até que um leitor seja abertopipe
porque é o shell que executa o procedimentoopen()
e assim que houver um leitor nopipe
link fspipe
forrm
'd e, em seguida,cat
copie o infile para o descritor do shell para esse canal. E de qualquer maneira, se você deseja propagar um erro de um processo sub do: <( ! : || kill -2 "$$")