Estou tentando redirecionar stderr para stdout e depois para um arquivo em um script init, mas quando introduzo stderr para stdout, recebo o erro “Redirecionamento de saída ambíguo”. Stdout sozinho não resulta no erro e grava no arquivo de log onde afirmei. Eu tentei o seguinte
-jar /jbeaulau_test/microservices/config-server-0.0.2-RELEASE.jar &>/jbeaulau_test/microservices/log/all.log & -jar /jbeaulau_test/microservices/config-server-0.0.2-RELEASE.jar >/jbeaulau_test/microservices/log/all.log 2>&1 &
Qualquer conselho seria apreciado.
Comentários
Resposta
Se você “estiver executando (t) csh, obterá Ambiguous output redirect.
se você tentar configurar dois redirecionamentos conflitantes:
> echo foo > a > b Ambiguous output redirect.
No Bash, você pode obter um erro semelhante se usar uma matriz com vários elementos no lugar do nome do arquivo:
$ set aa bb $ echo foo > "$@" bash: "$@": ambiguous redirect
Conforme mencionado nas respostas a redirecionamento de stderr não funciona em csh , o operador >&
funciona em (t) csh para redirecionar tanto stdout quanto stderr. 2>&1
é a maneira padrão de redirecionar stderr para o mesmo lugar que stdout, mas (t) csh não suporta isso. Em vez disso, usa a combinação > foo 2>&1
como um redirecionamento para foo
, um argumento regular 2
e um redirecionamento para 1
e os redirecionamentos estão em conflito, então você obtém o erro.
>&
também funciona em Bash e zsh, mas não é um recurso padrão.
Resposta
A segunda entrada deve funcionar bem. O erro de “redirecionamento ambíguo” às vezes acontece se você tiver espaços onde não deveriam estar ou, inversamente, quando um espaço importante está faltando.
Eu simplificaria seu comando para demonstrar:
echo "Test" >/tmp/x.txt 2>&1 &
A parte “> /tmp/x.txt” redirecionará o stdout (identificador de arquivo # 1). Um espaço entre o> e o nome do arquivo é permitido (embora neste contexto seria confuso), mas de outra forma não deveria haver nenhum espaço aqui.
O 2> & 1 redirecionará stderr (identificador de arquivo 2) para qualquer arquivo o identificador 1 vai para (que é stdout). Também não deve haver espaços aqui.
O & colocará sua tarefa em segundo plano. Isso deve ser compensado com um espaço do caractere anterior.
Reverter os dois redirecionamentos não funciona (embora echo seja uma escolha ruim aqui, pois não produz saída stderr):
echo "This will not work" 2>&1 >/tmp/x.txt &
Isso significa:
2>&1
Redirecionar o identificador de arquivo 2 para onde o identificador de arquivo 1 vai (que neste ponto ainda é o console)
>/tmp/x.txt
Redirecione o identificador de arquivo 1 para um arquivo – mas desde o identificador de arquivo 2 (stderr) já é redirecionado neste ponto, ele manterá seu destino e ainda irá para o console.
O primeiro comando que você escreveu é simplesmente um erro de sintaxe.
echo &>/tmp/x.txt
Atualização : @Wildcard apontou nos comentários que esta é realmente uma sintaxe válida.
Comentários
-
The ">/tmp/x.txt" part will redirect stdout (file handle #1). It must not contain any spaces.
. Ele pode conter o espaço.command >out.txt
==command > out.txt
- Você está certo; Eu cometi um erro aí. Corrigindo.
- " O primeiro comando que você escreveu é simplesmente um erro de sintaxe. " Não, é ' não; ela ' é a sintaxe Bash preferida para redirecionar tanto stdout quanto stderr. Veja
LESS='+/Redirecting Standard Output and Standard Error' man bash
- @Wildcard – obrigado. Eu nunca paro de aprender!
echo &> foo
. (2) Não dê exemplos de comandos que são assíncronos se você não precisar. (3) Aprenda sobre conchas. Há mais de um shell no Unixverse e eles aceitam diferentes sintaxes de comando. Aprenda como saber qual shell você está usando.