[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [shell-script-pt] Descritores duplicados
From: |
Blau Araujo |
Subject: |
Re: [shell-script-pt] Descritores duplicados |
Date: |
Mon, 14 Mar 2022 09:17:29 -0300 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.6.1 |
Salve!
No processo da duplicação de um descritor de arquivos, o dispositivo
para o qual um descritor de arquivos X aponta é copiado para o descritor
de arquivos Y.
```
Y>&X ou Y<&X
```
> Dica: pode facilitar muito ler a notação `&X` como "**para onde
aponta X**".
Para que isso funcione, o apontamento do descritor de arquivos X tem que
estar previamente definido, o que se dá no processamento (da esquerda
para a direita) dos operadores de redirecionamento padrão em um comando
ou na predefinição de um descritor customizado.
Observe:
```
~ $ ls -l /proc/self/fd > arquivo 2>&1
```
Neste exemplo, o shell processou o redirecionamento de FD1 (stdout) para
`arquivo` e, em seguida, duplicou o apontamento de FD1 em FD2 (stderr).
Isso quer dizer que tanto FD1 quanto FD2 redirecionarão seus fluxos de
dados para `arquivo`, o que podemos comprovar lendo o seu conteúdo:
```
~ $ cat arquivo
total 0
lr-x------ 1 blau blau 64 mar 14 08:30 3 -> /proc/285844/fd
lrwx------ 1 blau blau 64 mar 14 08:30 0 -> /dev/pts/0
l-wx------ 1 blau blau 64 mar 14 08:30 1 -> /home/blau/arquivo
l-wx------ 1 blau blau 64 mar 14 08:30 2 -> /home/blau/arquivo
```
Repare que os descritores 1 e 2 eram links simbólicos para
`/home/blau/arquivo` durante a execução do comando. Além disso, no Bash,
nós temos o mesmo resultado com a notação `&>`:
```
~ $ ls -l /proc/self/fd &> arquivo
~ $ cat arquivo
total 0
lr-x------ 1 blau blau 64 mar 14 08:47 3 -> /proc/286130/fd
lrwx------ 1 blau blau 64 mar 14 08:47 0 -> /dev/pts/0
l-wx------ 1 blau blau 64 mar 14 08:47 1 -> /home/blau/arquivo
l-wx------ 1 blau blau 64 mar 14 08:47 2 -> /home/blau/arquivo
```
Por outro lado, se o experimento fosse realizado com a ordem inversa dos
operadores, o resultado seria:
```
~ $ ls -l /proc/self/fd 2>&1 > arquivo
~ $ cat arquivo
total 0
lr-x------ 1 blau blau 64 mar 14 08:43 3 -> /proc/286076/fd
lrwx------ 1 blau blau 64 mar 14 08:43 0 -> /dev/pts/0
l-wx------ 1 blau blau 64 mar 14 08:43 1 -> /home/blau/arquivo
lrwx------ 1 blau blau 64 mar 14 08:43 2 -> /dev/pts/0
```
Como os operadores são processados da esquerda para a direita, no
momento em que FD1 foi duplicado em FD2, FD1 apontava para sdtout (a
tela do terminal), tendo sido redirecionado para `arquivo` apenas no
momento seguinte.
Com descritores customizados, o apontamento do novo descritor está
previamente definido para um arquivo, tornando indiferente a ordem:
```
~ $ exec 3> arquivo
~ $ ls -l /proc/self/fd 2>&3 >&3
~ $ cat arquivo
total 0
lr-x------ 1 blau blau 64 mar 14 08:55 4 -> /proc/286459/fd
lrwx------ 1 blau blau 64 mar 14 08:55 0 -> /dev/pts/0
l-wx------ 1 blau blau 64 mar 14 08:55 1 -> /home/blau/arquivo
l-wx------ 1 blau blau 64 mar 14 08:55 2 -> /home/blau/arquivo
l-wx------ 1 blau blau 64 mar 14 08:55 3 -> /home/blau/arquivo
```
Mas, observe o que escrevemos para utilizar o descritor customizado FD3:
```
`>&3`
```
Isso significa que a saída padrão (FD1) será copiada para onde aponta
FD3, e foi exatamente isso que nós vimos no resultado do último comando:
ou seja, houve uma duplicação do descritor de arquivos 3.
Espero que tenha ficado mais claro... ;-)
Abraços
Blau Araujo
-----------------------------
https://debxp.org
https://blauaraujo.com
Em 14/03/2022 03:36, Jamenson Espindula escreveu:
Saudações.
Eu já tentei entender, porém sinto muita dificuldade com o tal do
"descritor (de arquivo) duplicado".
Teria como alguém ensinar didaticamente como funciona? Exemplos didáticos?
Muito grato.
Jamenson Ferreira Espindula de Almeida Melo
Jaboatão dos Guararapes, Pernambuco, Brasil
Usuário GNU/Linux nº 166197
https://linuxcounter.net/cert/166197.png
Impressão digital da chave PGP:
234D 1914 4224 7C53 BD13 6855 2AE0 25C0 08A8 6180
_______________________________________________
Lista brasileira de usuários de shell script
Endereço de e-mail da lista: shell-script-pt@nongnu.org
Para se inscrever ou desinscrever acesse:
https://lists.nongnu.org/mailman/listinfo/shell-script-pt
Para ver os arquivos da lista (mensagens anteriores) e pesquisar nelas, acesse
https://lists.nongnu.org/archive/html/shell-script-pt/
NOTA: A lista anterior, no Yahoo Groups, foi *desativada*. Por favor utilize
somente esta.