O que “3> & 1 1> & 2 2> & 3” fazem em um script?

Respostas:

77

Os números são descritores de arquivos e apenas os três primeiros (começando com zero) têm um significado padronizado:

0 - stdin
1 - stdout
2 - stderr

Portanto, cada um desses números em seu comando se refere a um descritor de arquivo. Você pode redirecionar um descritor de arquivo para um arquivo >ou redirecioná-lo para outro descritor de arquivo com>&

O 3>&1na sua linha de comando criará um novo descritor de arquivo e o redirecionará para o 1que é STDOUT. Agora 1>&2redirecionará o descritor de arquivo 1 para STDERRe 2>&3redirecionará o descritor de arquivo 2 para 3, o que é STDOUT.

Então, basicamente, você mudou STDOUTe STDERR, estas são as etapas:

  1. Crie um novo fd 3 e aponte-o para o fd 1
  2. Redirecione o descritor de arquivo 1 para o descritor de arquivo 2. Se não tivéssemos salvado o descritor de arquivo em 3, perderíamos o destino.
  3. Redirecione o descritor de arquivo 2 para o descritor de arquivo 3. Agora, os descritores de arquivo um e dois são alternados.

Agora, se o programa imprimir algo no descritor de arquivo 1, ele será impresso no descritor de arquivo 2 e vice-versa.

Ulrich Dangel
fonte
Você disse "O 3> & 1 na sua linha de comando criará um novo descritor de arquivo e o redirecionará para 1, que é STDOUT". Mas 1 não significa STDIN?
sofs1
19

Está trocando stdoute stderr.

>namesignifica redirecionar a saída para o arquivo name.

>&numbersignifica redirecionar a saída para o descritor de arquivo number.

Portanto, &é necessário informar ao shell que você quer dizer um descritor de arquivo, não um nome de arquivo.

Um descritor de arquivo é um número que se refere a um arquivo já aberto. Os padrões são 0para entrada padrão, 1para saída padrão ou 2para erro padrão. Você também pode usar qualquer outro número, o que criará um novo descritor de arquivo, assim como quando você cria uma nova variável com var=value.

Por padrão, tanto o descritor de arquivo 1como o 2acessam /dev/tty, portanto, se você executar somecommand 3>&1 1>&2 2>&3em um novo shell, ele não muda nada (exceto agora você tem um descritor de arquivo número 3).

Mas se em algum lugar anterior do script ele faz um redirecionamento usando exec (por exemplo exec 2>error.log), ou o script é executado com uma linha de comando incluindo o redirecionamento (por exemplo ./thescript 2>error.log), a troca de stdout e stderr fará alguma coisa.

No seu caso específico, o comando que está trocando stdout e stderr é dialog. Olhando para sua página de manual , vejo

Some widgets, e.g., checklist, will write text to dialog's output.
Normally that is the standard error

então talvez a pessoa que escreveu o script queira dialogir para a saída, em stdoutvez de stderrpor algum motivo.

Veja também Ordem de redirecionamentos

Mikel
fonte
1

O escritor do script definiu o fd 3 como:

exec 3<> File.txt

Abra "File.txt" e atribua fd 3 a ele. Descritores máximos de arquivo: 255

read -n 4 <&3

Leia apenas 4 caracteres.

echo -n . >&3

Escreva um ponto decimal lá.

exec 3>&-

Feche o fd 3.

cat File.txt

==> 1234.67890

Jonathan Jackson
fonte