shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script-pt] Descritores duplicados


From: Jamenson Espindula
Subject: Re: [shell-script-pt] Descritores duplicados
Date: Mon, 14 Mar 2022 22:07:12 -0300

Em seg., 14 de mar. de 2022 às 09:20, Blau Araujo <blau@debxp.org> escreveu:
>
> 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.
>
> _______________________________________________
> 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.

Saudações, Blau. Muito grato por responder.

No exemplo dado <ls -l /proc/self/fd > arquivo 2>&1>:

1 - "ls" listou o conteúdo do diretório </proc/self/fd/>;

2 - O GNU Bash direcionou o resultado (a listagem) para o arquivo
"arquivo" ( > );

3 - O GNU Bash direcionou o Descritor "2" para onde apontava o
Descritor "1" (que, na situação, apontava para o arquivo "arquivo") (
2>&1 ).


No exemplo dado <ls -l /proc/self/fd 2>&1 > arquivo>:

1 - "ls" listou o conteúdo do diretório </proc/self/fd/>;

2 - O GNU Bash direcionou o Descritor "2" para onde apontava o
Descritor "1" (que, na situação, apontava para a tela do terminal) (
2>&1 );

3 - O GNU Bash direcionou o resultado (a listagem) para o arquivo
"arquivo" ( > ).


No exemplo dado <exec 3> arquivo>:

1 - O GNU Bash criou um Descritor (Descritor "3");

2 - O GNU Bash apontou o Descritor "3" para o arquivo "arquivo".


Utilizando o Descritor "3":

No exemplo dado <ls -l /proc/self/fd 2>&3 >&3>:

1 - "ls" listou o conteúdo do diretório </proc/self/fd/>;

2 - O GNU Bash direcionou o Descritor "2" para onde apontava o
Descritor "3" (que, na situação, apontava para o arquivo "arquivo") (
2>&3 );

2 - O GNU Bash direcionou o resultado (a listagem) para o Descritor
"1" e direcionou o Descritor "1" para onde apontava o Descritor "3"
(que, na situação, apontava para o arquivo "arquivo") ( >&3 ).


Meus testes:

exec 3> arquivo
ls -l /proc/self/fd/ 1>&3 2>&3
ls -l /proc/self/fd/ 2>&3 1>&3
cat arquivo
total 0
lrwx------ 1 jamenson jamenson 64 mar 14 21:54 0 -> /dev/pts/0
l-wx------ 1 jamenson jamenson 64 mar 14 21:54 1 -> /home/jamenson/arquivo
l-wx------ 1 jamenson jamenson 64 mar 14 21:54 2 -> /home/jamenson/arquivo
l-wx------ 1 jamenson jamenson 64 mar 14 21:54 3 -> /home/jamenson/arquivo
lr-x------ 1 jamenson jamenson 64 mar 14 21:54 4 -> /proc/4033/fd
total 0
lrwx------ 1 jamenson jamenson 64 mar 14 21:55 0 -> /dev/pts/0
l-wx------ 1 jamenson jamenson 64 mar 14 21:55 1 -> /home/jamenson/arquivo
l-wx------ 1 jamenson jamenson 64 mar 14 21:55 2 -> /home/jamenson/arquivo
l-wx------ 1 jamenson jamenson 64 mar 14 21:55 3 -> /home/jamenson/arquivo
lr-x------ 1 jamenson jamenson 64 mar 14 21:55 4 -> /proc/4036/fd


De fato, como afirmado, a ordem dos direcionamentos não importa no
caso de um Descritor de Arquivos personalizado.

Entendi melhor!

Agora, como eu uso isso no dia a dia?

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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]