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

55

Eu vi esta linha em um script:

DEVICE='dialog --inputbox "Festplatten-Laufzeit auslesen. Gebe Sie das 
gewünschte Device an: " 0 70 "" 3>&1 1>&2 2>&3'

O que é

3>&1 1>&2 2>&3

fazendo? Eu sei que 1 = stdout e 2 = stderr, mas quais são os 3 e & ?

    
por jsterr 10.07.2012 / 14:49

2 respostas

62

Os números são descritores de arquivos e somente 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 no seu comando se refere a um descritor de arquivo. Você pode redirecionar um descritor de arquivo para um arquivo com > ou redirecioná-lo para outro descritor de arquivo com >&

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

Então, basicamente, você alternou STDOUT e STDERR , estas são as etapas:

  1. Crie um novo fd 3 e aponte para o fd 1
  2. Redirecionar 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. Redirecionar o descritor de arquivos 2 para o descritor de arquivos 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.

    
por 10.07.2012 / 15:08
16

Está a trocar stdout e stderr .

>name significa saída de redirecionamento para o arquivo name .

>&number significa saída de redirecionamento para o descritor de arquivo number .

Portanto, o & é necessário para dizer 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 0 para entrada padrão, 1 para saída padrão ou 2 para erro padrão. Você também pode usar qualquer outro número, o que criará um novo descritor de arquivo, como quando você cria uma nova variável com var=value .

Por padrão, o descritor de arquivo 1 e 2 vai para /dev/tty , portanto, se você executar somecommand 3>&1 1>&2 2>&3 em um novo shell, ele não alterará nada (exceto que agora você tem um descritor de arquivo número 3 ).

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

No seu caso específico, o comando que está com stdout e stderr trocados é dialog . Olhando para o seu man page , 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 que a saída de dialog vá para stdout em vez de stderr por algum motivo.

Veja também Ordem dos redirecionamentos

    
por 11.07.2012 / 04:23

Tags