Primeiro, qualquer coisa após >
ou >>
é um nome de arquivo; então > 1
grava em um arquivo chamado 1
.
Os números nos outros formulários fornecidos no seu exemplo são descritores de arquivos. Por padrão, os programas começam com os descritores de arquivo 0 (entrada padrão), 1 (saída padrão) e 2 (erro padrão) conectados; quando você inicia um programa a partir de um shell interativo, eles são conectados à entrada e à saída do terminal (você pode vê-los executando ls -l /proc/$$/fd
no Linux).
Especificar um número antes de >
, >>
ou >&
especifica o descritor de arquivo que você deseja manipular; o número deve estar bem na frente do símbolo >
. Assim
echo Example 2> stderr
imprimirá "Exemplo" e criará um arquivo stderr
vazio (que conterá qualquer coisa enviada para o erro padrão).
Você pode pensar em descritores de arquivos como entradas em uma tabela, apontando para arquivos; assim, por padrão:
- 0 pontos para
/dev/tty
- 1 pontos para
/dev/tty
- 2 pontos para
/dev/tty
Especificar 1> file
(ou simplesmente > file
) atualiza o descritor de arquivo 1 para apontar para file
, aberto no modo de truncamento (portanto, seu conteúdo é substituído). A especificação de 2> 1
atualiza o descritor de arquivo 2 para apontar para um arquivo chamado 1
, aberto no modo de truncamento.
A duplicação de descritores de arquivos usando >&
(ou &>
, que é a forma preferida) simplesmente atualiza um descritor de arquivo para apontar para o que o outro está apontando. No seu último exemplo, > file
atualiza o descritor de arquivo 1:
- 0 pontos para
/dev/tty
- 1 pontos para
file
- 2 pontos para
/dev/tty
e, em seguida, 2>&1
atualiza o descritor de arquivo 2:
- 0 pontos para
/dev/tty
- 1 pontos para
file
- 2 pontos para
file
(o pedido é significativo: > file 2>&1
produz o acima, 2>&1 > file
só acabaria redirecionando o descritor de arquivo 1).
O formulário 1>&9
só funciona se o descritor de arquivo 9 tiver sido aberto, por exemplo. , copiando o descritor de arquivo 1 para ele ( 9>&1
) ou abrindo um arquivo ( 9> file
). Esse tipo de construção pode ser útil para acompanhar o conteúdo original dos descritores de arquivos ao redirecionar; Assim, em um script, você pode copiar 1 e 2 com segurança, redirecionar a saída e o erro padrão para qualquer finalidade que você precisar e, em seguida, restaurá-los ...
O manual do Bash contém todos os detalhes.