Existe uma ferramenta Bash padrão que age como eco, mas gera stderr em vez de stdout?
Eu sei que posso fazer, echo foo 1>&2
mas é meio feio e, suspeito, propenso a erros (por exemplo, é mais provável que seja editado errado quando as coisas mudam).
Respostas:
Você poderia fazer isso, o que facilita a leitura:
>&2
copia o descritor de arquivo nº 2 para o descritor de arquivo nº 1. Portanto, depois que esse redirecionamento é realizado, os dois descritores de arquivo se referem ao mesmo arquivo: o descritor de arquivo nº 2 estava originalmente se referindo. Para obter mais informações, consulte o Tutorial de redirecionamento ilustrado do Bash Hackers .fonte
alias
script em shell. Provavelmente seria mais seguro usarerrcho(){ >&2 echo $@; }
errcho(){ >&2 echo $@|pr -To5;}
, não vai funcionar. Para fazer algo assim, você terá que colocar o redirecionamento em algum lugar após o último canal, como:errcho(){ echo $@|>&2 pr -To5;}
Você pode definir uma função:
Isso seria mais rápido que um script e não terá dependências.
A sugestão específica do bash de Camilo Martin usa uma "string aqui" e imprime qualquer coisa que você passar, incluindo argumentos (-n) que o eco normalmente engoliria:
A solução de Glenn Jackman também evita o problema da deglutição:
fonte
echoerr -ne xt
não vai imprimir "-ne xt". Melhor usoprintf
para isso.echoerr() { cat <<< "$@" 1>&2; }
printf "%s\n" "$*" >&2
$IFS
espaços em branco é enviado como um argumento separado, que, no caso deecho
concatená-los com0x20
s, mas os perigos de não citar superam em muito a conveniência de digitar menos dois caracteres) .Como
1
é a saída padrão, você não precisa nomeá-la explicitamente na frente de um redirecionamento de saída,>
mas sim, simplesmente digitar:Como você parece estar preocupado com a
1>&2
dificuldade de digitar com segurança, a eliminação do redundante1
pode ser um pequeno incentivo para você!fonte
Outra opção
fonte
foo
- tem seu próprio stderr redirecionado - por exemplofoo >foo.log 2>&1
-, entãoecho foo >/dev/stderr
irá sobrecarregar toda a saída anterior.>>
deve ser usado:echo foo >>/dev/stderr
/dev/fd/2
./proc/self/fd/2
. Veja minha resposta abaixo :)Não, essa é a maneira padrão de fazer isso. Não deve causar erros.
fonte
1>&2
. Todos desejamos que isso não aconteça, mas tenho certeza de que todos já fomos lugares onde isso acontece.( echo something 1>&2 ; something else ) > log
->(echo something; cp some junk 1>&2 ; something else) > log
Opa.Se você não se importa de registrar a mensagem também no syslog, a maneira not_so_ugly é:
A opção -s significa: "Envie a mensagem para o erro padrão e também para o log do sistema".
fonte
Essa é uma função STDERR simples, que redireciona a entrada do tubo para STDERR.
fonte
echo what | /dev/stderr
...Nota: Estou respondendo à pergunta pós-não-enganosa / vaga "eco que gera stderr" (já respondida pelo OP).
Use uma função para mostrar a intenção e obter a implementação que você deseja. Por exemplo
E
error_handling
sendo:Razões que tratam das preocupações no OP:
Outras razões:
fonte
Minha sugestão:
ou
echo "my errz" > /proc/self/fd/2
vai efetivamente saída parastderr
porque/proc/self
é um link para o processo atual, e/proc/self/fd
detém o processo aberto descritores de arquivo, e em seguida,0
,1
e2
representamstdin
,stdout
estderr
respectivamente.O
/proc/self
link não funciona no MacOS, no entanto,/proc/self/fd/*
está disponível no Termux no Android, mas não/dev/stderr
. Como detectar o SO de um script Bash? pode ajudar se você precisar tornar seu script mais portátil, determinando qual variante usar.fonte
/proc/self
link não funciona no MacOS, portanto, continuarei com o/dev/stderr
método mais direto . Além disso, como observado em outras respostas / comentários, provavelmente é melhor usar>>
para acrescentar./proc/self/fd/*
está disponível no Termux no Android, mas não/dev/stderr
.Não use,
cat
pois alguns são mencionados aqui.cat
é um programa whileecho
eprintf
são bash (shell) embutidos. Iniciar um programa ou outro script (também mencionado acima) significa criar um novo processo com todos os seus custos. Usando builtins, as funções de escrita são bastante baratas, porque não há necessidade de criar (executar) um processo (ambiente).O opner pergunta "existe alguma ferramenta padrão para enviar ( pipe ) ao stderr", a resposta do schort é: NÃO ... por quê? ... rediredcting pipes é um conceito elemantário em sistemas como o unix (Linux ...) e o bash (sh) se baseia nesses conceitos.
Eu concordo com o abridor de que redirecionar com notações como esta:
&2>1
não é muito agradável para programadores modernos, mas isso é uma loucura. O Bash não teve a intenção de escrever programas enormes e robustos, mas sim ajudar os administradores a trabalhar com menos pressionamentos de tecla ;-)E pelo menos, você pode colocar o redirecionamento em qualquer lugar da linha:
fonte
cat
e instruir alguém a não usar gato porque é lento. Existem inúmeros casos de uso em que gato é a escolha certa, por isso oponho-me à sua resposta.echo
substituição. Mesmo se ele usarcat
, ele precisará usar um redirecionamento do bash. de qualquer forma. Portanto, não há absolutamente nenhum sentido em usarcat
aqui. BTW eu usocat
100 vezes por dia, mas nunca no contexto que a abertura pediu ... você entendeu?Outra opção que encontrei recentemente é a seguinte:
Isso usa apenas os integrados do Bash e, ao mesmo tempo, torna a saída de erro de várias linhas menos propensa a erros (já que você não precisa se lembrar de adicionar
&>2
a todas as linhas).fonte
cat
ou qualquer outro utilitário, o que é fora de tópico para a pergunta.read
é um comando interno do shell que imprime no stderr e pode ser usado como eco sem executar truques de redirecionamento:A
-t 0.1
é um tempo de espera que desactiva de funcionalidade principal ler, armazenar uma linha de entrada padrão para uma variável.fonte
Faça um script
essa seria sua ferramenta.
Ou crie uma função se você não quiser ter um script em arquivo separado.
fonte
Mac OS X: Tentei a resposta aceita e algumas outras respostas, e todas resultaram na criação de STDOUT e não de STDERR no meu Mac.
Aqui está uma maneira portátil de gravar em erro padrão usando o Perl:
fonte