Seguindo em Usando loop while para ssh para vários servidores , ou seja, para
while IFS= read -r -u9 HOST ; do ssh "$HOST" "uname -a" ; done 9< servers.txt
que lê um descritor de arquivo diferente ( 9
),
Como fazê-lo ler a partir de um canal de um descritor de arquivo diferente?
Se meu comando pipe for grep
, qual é a maneira mais fácil de grep
gravar no nono descritor de arquivo e qual é a sintaxe de canalizar o nono descritor de arquivo?
Se você quer
while IFS= read -ru9 line; do ...; done
fazer um loop sobre a saída degrep
em vez do conteúdo deservers.txt
, então com bash, zsh ou versões recentes de ksh93¹, você pode usar o redirecionamento de uma substituição de processo em vez de um pipeline:grep
será executado com seu stdout redirecionado para o final de escrita de um canal e<(...)
será substituído por um caminho de arquivo que, uma vez aberto (aqui no fd 9 usando redirecionamento de entrada regular), apontará para o final de leitura desse mesmo canal. Dependendo do sistema e/ou shell, será um pipe nomeado ou/dev/fd/<a-number>
algo semelhante (como/proc/self/fd/<a-number>
).Portavelmente (em qualquer shell do tipo POSIX), você pode fazer:
Isso está usando um pipeline normal, mas fazendo alguns embaralhamentos de fd para que o fd aberto na extremidade de leitura do pipe seja movido para fd 9 e o fd 0 seja restaurado para o stdin original usando um fd 3 temporário.
Esteja ciente de que em alguns shells, incluindo o bash (exceto quando a
lastpipe
opção está habilitada e o shell não é interativo), owhile
loop será executado em um subshell.Em vez de usar
read
o fd 9, você também pode simplesmenteOnde apenas restauramos
ssh
o stdin para o original fora do pipeline usando aquele truque de redirecionamento fd 3 novamente.Em vez de um
while
loop, em um sistema GNU, você pode usarxargs
como:Para obter a lista de
servers.txt
um por linha e:Para obtê-lo da saída de
grep
.Você também pode adicionar alguns
-P0
para executar todos eles em paralelo ou-P4
para executar até 4 em paralelo (mas em ambos os casos todos compartilhando o mesmo stdin).Outro benefício é que se um dos
ssh
falha, isso será refletido no status geral de saída.Em vez de usar
grep
, você também pode fazer a correspondência de padrões de shell no loop:(sintaxe padrão
sh
e não rodando em um subshell).¹ ksh é o shell que introduziu a substituição de processos em meados dos anos 80, mas até recentemente, você não conseguia redirecionar o fds de lá.