Por que você não pode redirecionar para arquivos corretamente quando você troca stdout e stderr por não usar o comando Agrupamento?

2

Eu tentei trocar o stdout e o stderr e redirecionar cada fluxo para os arquivos, no shell interativo do bash.

Usando o comando de agrupamento de chaves, ganhei a saída que eu quero. Mas eu não entendo porque quando eu não uso o comando Grouping, o resultado não é trocado.

$ # Using Grouping command. Swap operation is succeed.
$ { { echo stdout; echo stderr 1>&2; } 3>&1 1>&2 2>&3; } 1>1.txt 2>2.txt;
$ cat 1.txt
stderr
$ cat 2.txt
stdout

$ # Not using Grouping command. Swap is failed...
$ { echo stdout; echo stderr 1>&2; } 3>&1 1>&2 2>&3 1>1.txt 2>2.txt;
$ cat 1.txt
stdout
$ cat 2.txt
stderr

Meu entendimento da operação de troca de descritores de arquivos com relação ao comando acima foi o seguinte.

  1. 3>&1 : redireciona FD3 para FD1 (stdout)
  2. 1>&2 : redirecionar FD1 para FD2 (stderr)
  3. 2>&3 : redireciona FD2 para FD3 (stdout)
  4. 1>1.txt : redireciona FD1 para 1.txt (FD1 aponta para stderr)
  5. 2>2.txt : redireciona FD2 para 2.txt (FD2 aponta para stdout)

Mas, no meu entendimento, acho que o resultado não deve mudar dependendo de se há chaves ou não.

Estou fazendo alguns mal-entendidos básicos? Por que os dois resultados de comando acima são diferentes?

Info meu env.

$ bash --version
GNU bash, version 4.4.12(1)-release (x86_64-apple-darwin16.3.0)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
    
por fhiyo 26.10.2017 / 16:51

1 resposta

0

O Bash processa os descritores de arquivos na ordem inversa, da direita para a esquerda. Primeiro 2>2.txt , depois 1>1.txt e assim por diante ...

    
por 26.10.2017 / 17:22