Eu vi essa 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 o que são o 3
eo &
para?
Respostas:
Os números são descritores de arquivos e apenas os três primeiros (começando com zero) têm um significado padronizado:
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>&1
na sua linha de comando criará um novo descritor de arquivo e o redirecionará para o1
que éSTDOUT
. Agora1>&2
redirecionará o descritor de arquivo 1 paraSTDERR
e2>&3
redirecionará o descritor de arquivo 2 para 3, o que éSTDOUT
.Então, basicamente, você mudou
STDOUT
eSTDERR
, estas são as etapas:Agora, se o programa imprimir algo no descritor de arquivo 1, ele será impresso no descritor de arquivo 2 e vice-versa.
fonte
Está trocando
stdout
estderr
.>name
significa redirecionar a saída para o arquivoname
.>&number
significa redirecionar a saída para o descritor de arquivonumber
.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
0
para entrada padrão,1
para saída padrão ou2
para 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 comvar=value
.Por padrão, tanto o descritor de arquivo
1
como o2
acessam/dev/tty
, portanto, se você executarsomecommand 3>&1 1>&2 2>&3
em 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 , vejoentão talvez a pessoa que escreveu o script queira
dialog
ir para a saída, emstdout
vez destderr
por algum motivo.Veja também Ordem de redirecionamentos
fonte
O escritor do script definiu o fd 3 como:
Abra "File.txt" e atribua fd 3 a ele. Descritores máximos de arquivo: 255
Leia apenas 4 caracteres.
Escreva um ponto decimal lá.
Feche o fd 3.
==> 1234.67890
fonte