Por que o Bash não aceita '&& 3', isto é, redirecionando stdout e stderr para o descritor de arquivo 3?

0

Dado o preâmbulo, foobar function e invocações dele:

exec 3>/dev/null    
function foobar { echo foo; echo bar >&2; }
foobar >/dev/null
foobar 2>/dev/null
foobar &>/dev/null
foobar &>&3

Por que o último comando simples não é executado pelo Bash? Em vez disso, Bash sai com:

-bash: syntax error near unexpected token '&'
    
por Tim Friske 26.11.2012 / 00:38

2 respostas

4

Isso porque não há operador &>& .

Existe um operador &> word que redireciona stdout e stderr para word .

Existe um operador [n]>& word que duplica fd n (padrão 1 ) de fd word . Como um caso especial, se n estiver vazio e word não for um número, redirecionará stdout e stderr para word .

Mas é isso. Não há uma sintaxe especial para descritores de arquivos que você pode combinar com operadores. Existem apenas os operadores, que podem interpretar seus operandos como descritores de arquivos ou nomes de arquivos. E não há um operador &>& que redireciona stdout e stderr e interpreta seu operando direito como um descritor de arquivo.

Resumo: não há sintaxe especial &n para descritores de arquivos. O & pertence ao operador, não ao operando. Não há operador &>& .

    
por 26.11.2012 / 01:16
2

E por que isso? "... & > arquivo" é apenas um acréscimo sintático para "... > arquivo 2 > & 1". Nada mais. Se você quiser fazer o descritor 2 point onde 3 está apontando (/ dev / null), você precisa usar "... 2 > & 3".

    
por 26.11.2012 / 01:08