O que é '&' em termos simples? [duplicado]

1

O que $ command 1>&2 faz? Pelo que entendi, isso executa o command , mas com o STDOUT redirecionado para o STDERR . Mas não sei exatamente como >& funciona.

Eu vi isso como $ command 1>&2 e $ command 2>&1 .

Acho que os 1 e 2 são os descritores de arquivos para STDOUT e STDERR , respectivamente, mas também não sei ao certo o que isso significa.

Eu encontrei em SO e outros recursos que >& é algum tipo de redirecionamento "coisa (operador ??)", não sei exatamente como funciona. É um operador binário? É mesmo um operador?

Alguém pode explicar nos termos novato o que isso significa.

    
por nodebase 05.06.2015 / 19:56

3 respostas

3

Nessa sintaxe, você está certo de que 1 é STDOUT e 2 é STDERR. O que ele faz é "pegar a coisa A e enviá-la para onde a coisa B estiver". Então, 2>&1 , que também pode ser escrito 2 > &1 , pega STDERR e envia para STDOUT. Isso não é necessariamente o STDOUT original. O >& não é realmente uma unidade, é apenas muitas vezes escrito em conjunto dessa maneira. O > é o operador "redirecionamento".

Onde fica interessante é encomendar ... por exemplo:

$ command 2>&1 > file.out

é diferente de

$ command > file.out 2>&1

O primeiro envia STDERR para STDOUT, depois STDOUT para "file.out", então você obtém STDERR e STDOUT no mesmo lugar. O segundo envia STDOUT para "file.out", depois STDERR para STDOUT, então você acaba com STDERR na janela do terminal, não no arquivo.

    
por 05.06.2015 / 19:59
2

& é o prefixo que você dá aos descritores de arquivos que o shell tem aberto, ao contrário dos caminhos dos arquivos não abertos (que é o padrão). STDOUT é quase sempre descritor de arquivo 1 e STDERR quase sempre 2 .

Para o colchete angular, o seu shell é geralmente inteligente o suficiente para saber qualquer número que o anteceda ser o descritor de arquivo. Se você omitir um, normalmente você está falando de STDOUT para > e STDIN para < .

Então, montando:

# command > /tmp/myFile
# command 1> /tmp/myFile

Direcione command ' STDOUT para o arquivo simples chamado /tmp/myFile

# command >&2
# command 1>&2

Direcione command ' STDOUT para o arquivo já aberto no descritor de arquivo 2 (STDERR).

# command 2>&1

Redireciona qualquer coisa que normalmente seria gravada em STDERR para o número do descritor de arquivo 1 ( STDOUT ).

Estes são genéricos para qualquer tipo de arquivo de E / S que você faz do próprio shell. É só que o próprio descritor de arquivos em questão geralmente tem um significado especial.

Se você quiser, pode redirecionar STDERR para um arquivo que também pode ser dito para atribuir o descritor de arquivo 2 a um arquivo nomeado:

# command 2> /tmp/newFile 

Por exemplo:

[root@edc4 ~]# ./causeError 2>/tmp/containError
[root@edc4 ~]# cat /tmp/containError
Error Message
[root@edc4 ~]#

O Bash HOWTO entra em muito mais detalhes sobre como trabalhar com arquivos descritores em bash . Você pode abrir arquivos embaixo de descritores de arquivos que não sejam os três usuais ( 0 , 1 e 2 ), mas isso geralmente é reservado para scripts mais elaborados e as pessoas geralmente lidam apenas com as três normais. Mesmo assim, geralmente é apenas 1 e 2 pessoas lidam com isso.

    
por 05.06.2015 / 20:09
0

Os números são os valores de índice para os tubos. 0 é stdin 1 é stdout e 2 é stderr como você mencionou corretamente. Você pode criar mais, se quiser, pela maneira como esses 3 são os principais que são criados para você manipular entradas e saídas de seu processo. a chevron > permite que você redirecione o fluxo de dados para um novo descritor. Por exemplo, um arquivo (cmd > ~ / somefile.out) ou nada se você quiser suprimi-lo (cmd > / dev / null) também permite que você feche o tubo (cmd > & -) eu tomaria cuidado com isso. mas você também pode fazer algo como (cmd 3 > & 2 2 > & 1 1 > & 2) para alternar entre padrão e padrão.

A chave é pensar nisso como um fio, como se você fosse um expedidor de estilo antigo, e você comece com o rótulo de fio 0, 1, 2 já conectado a alguns pontos padrão, e o > permite que você mude para onde o fio está conectado.

    
por 05.06.2015 / 20:12