Dentro de $(...)
, stdout (fd 1) é um pipe. Na outra extremidade do pipe, o shell lê a saída e a armazena na variável $result
.
Com: $({ blah; } 3>&1)
, concluímos que tanto o fd 3 quanto o 1 apontam para esse pipe em blah
.
blah
é cmd1 | cmd2
. Há cmd1
e cmd2
são iniciados simultaneamente com cmd1
fd 1 apontando para outro canal (aquele para cmd2
), mas não queremos que ssh
output vá para esse canal, queremos que ele vá para o primeiro pipe para que ele possa ser armazenado em $result
.
Portanto, temos { ssh >&3; echo "$?"; } | cmd2
, de modo que somente a saída echo
vá para o canal até cmd2
. ssh
output (fd 1) vai para $result
. ssh
não precisando de um fd 3, nós o fechamos para ele depois que usamos para definir fd 1 ( 3>&-
).
A entrada de cmd2
(fd 0) é o segundo tubo. Nada está gravando nesse pipe (desde que ssh
está gravando no primeiro canal) até que ssh
termine e echo
mostre o status de saída lá.
Portanto, em cmd2
(sendo o loop until
), o read -t1
está aguardando com o tempo limite até que ssh
seja encerrado. Depois disso, read
retornará com sucesso com o conteúdo de $?
alimentado por echo
.