Sintaxe correta para evitar a mensagem 'redirecionamento ambíguo' do bash

2

Estou tentando executar um comando que acumula stdout em um arquivo existente e envia as mensagens de erro para outro usando o comando abaixo.

commmand >> /home/user/accumulate_output.log 2>& /home/user/error.log que dá essa mensagem de erro

bash: /home/user/error.log :ambiguous redirect

Qual é a sintaxe correta?

    
por vfclists 22.01.2015 / 11:28

1 resposta

5

2>&1 significa que o redirecionamento do fluxo de erro para a saída padrão e o caracter & por si só não tem muito significado: ele está esperando por você para fornecer um número do descritor de arquivo, mas você está dando a ele um nome de arquivo istead. Você quer redirecionar para o arquivo, não um descritor de arquivo numerado, então

commmand >> /home/user/accumulate_output.log 2>/home/user/error.log

Você pode entender &1 e &2 como "nomes de arquivos" referindo-se aos descritores de arquivo de stdout e stderr. Agora você vê que & na frente de um nome de arquivo não faz sentido.

Em resumo, a sintaxe é n>&m ou n>file , em que n é o descritor do arquivo a ser redirecionado (se não for especificado, significa saída padrão, n=1 ) e, no lado direito, você pode redirecionar para o descritor de arquivo m ou um arquivo com o nome file . m pode ser um número ou - , o que significa que o descritor de arquivos deve ser fechado em vez de redirecionado (redirecionado "nowhere").

Há também uma sintaxe especial para redirecionar stdout e stderr para o mesmo local, mas é &> . Ele irá apenas confundir você, pois não se enquadra na sintaxe normal - é um atalho que realmente realiza dois redirecionamentos de uma só vez.

    
por 22.01.2015 / 11:35