inner.sh
poderia ser:
printf '%s\n' "$1" >&3
e em outer.sh
, você poderia fazer:
{ inner=$(middle "$@" 3>&1 >&4 4>&-); } 4>&1
printf '%s\n' "$inner"
O texto interno é passado por meio de um pipe (na substituição do comando) e armazenado em uma variável do shell. Isso pressupõe que middle
não feche o fd 3 antes de invocar inner.sh
(não há razão para isso).
Explicação:
- %código%. Nesse grupo de comandos, inicialmente, tanto fd 1 como 4 apontam para o stdout original. IOW, fizemos uma cópia do stdout do outer.sh para o fd 4 para poder recuperá-lo dentro da substituição do comando
-
%código%. Dentro dessa substituição de comando, stdout (fd 1) é um pipe. Esse é o ponto de substituição de comando. Quer pegar a saída do comando. Mas aqui, nós não queremos o stdout de
{ ... } 4>&1
, queremos o que ele (ou mais exatamente o seu filho$(...)
) escreve no fd 3, então: -
middle
: parainner.sh
, tornamos fd 3 o pipe cmdsubst, de forma que o quemiddle 3>&1 >&4 4>&-
escreve vai paramiddle
e restauramos o stdout deinner.sh
para o salvo stdout original em fd 4. Fechamos fd 4 depois de ter servido o seu propósito, pois$inner
não precisa fazer nada com ele.