shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] stderr/stdout


From: William Alves dos Santos
Subject: Re: [shell-script] stderr/stdout
Date: Fri, 2 Sep 2011 08:44:44 -0300

Minha pratica,


Quando iniciei os desenvolvimento com shell, eu também saia de algumas
situações redirecionando a saida de erro padrão, porém hoje adoto outro
metodo.

Primeiramente utilizo uma função para auxiliar, segue meu exemplo abaixo
onde será possível recustomizar a sua necesidade.

log_msg(){
  CURR_DT="`date +'%Y%m%d %H:%M:%S'`"
  echo "$CURR_DT - $*" | tee -a $LOGFILE 1>&2
}

depois utilizo:

log_msg "I: Mensagem de tal"


O que eu faço é armazenar todos os logs em um aquivo que é composto por data
e nome do script.

Agora é a diferença.

Como são scripts que tratam grandes atividades e rotineiras, eu informo o
que será feito, seguem as intruções para fazer e depois coleto o que foi
feito e onde concateno a informação no log novamente.

Pode parecer que ficou mais complexo, maior mas é extamente esse intuito,
controlar.

Ai quando surge um erro, o script é encerrado, abaixo o trap responsável:

trap "trap - ERR INT QUIT;finaliza 1 $LINENO" ERR QUIT INT

Dessa maneira consegui desenvolver os scripts com maior previsibilidade, e
evitar os erros inesperados.


Abraços

*William Alves dos Santos*
**Cel.: +55 (11) 6835 8172

<address@hidden> <http://www.proatividadeweb.com>


Em 2 de setembro de 2011 00:40, Rodrigo R. Martins
<address@hidden>escreveu:

> **
>
>
> Show de bola...
>
> Estou fora agora e não dá pra eu testar por enquanto, mas vou dar uma
> olhada
> com calma nestas dicas... :)
>
> Mais uma vez, valeu pessoal!
>
> Abraços,
>
> Em 2 de setembro de 2011 00:48, Julio C. Neves <address@hidden
> >escreveu:
>
> > **
>
> >
> >
> > Isso mesmo Fernando, por um detalhe simples: a função do exec é rodar um
> > processo sem abrir um subshell. Dessa forma o cmd atuaria sobre o próprio
> > shell.
> >
> > Sempre tenho usado a segunda sintaxe que coloquei, por ela ser mais
> > eficiente. Qdo vc grava em /dev/null, vc está fazendo um I/O e como vc
> sabe
> > isso é lento. Qdo vc faz 2>&-, vc simplesmente fecha o FD 2 (saída de
> erro)
> > e dessa forma não se faz I/O
> >
> >
> > Cordialmente,
> >
> > Julio Neves
> > *Quer programar bem em Shell?
> > *
> >
> > *Use este endereço de e-mail, o Skype ou ☎ (21)8112-9988 ☎*
> >
> > *
> > *
> >
> > **
> >
> > *
> > *
> > My profiles: [image: Twitter] <http://twitter.com/juliobash>
> > Contact me: [image: Skype] julioneves1
> > Em 1 de setembro de 2011 15:37, Fernando Mercês <address@hidden
> > >escreveu:
> >
> > > **
> >
> > >
> > >
> > > O exec vai reabrir a stderr e redecioná-la para /dev/null durante toda
> a
> > > execução, certo Julio?
> > >
> > > Legal hein. :)
> > >
> > >
> > > Att,
> > >
> > > Fernando Mercês
> > > Linux Registered User #432779
> > > www.mentebinaria.com.br
> > > softwarelivre-rj.org
> > > @MenteBinaria
> > > ------------------------------------
> > > Participe do I Hack'n Rio
> > > hacknrio.org
> > > ------------------------------------
> > >
> > > 2011/9/1 Julio C. Neves <address@hidden>
> > >
> > > > **
> > >
> > > >
> > > >
> > > > No inicio do prg use:
> > > >
> > > > exec 2> /dev/null
> > > >
> > > > ou:
> > > >
> > > > exec 2>&-
> > > >
> > > > Obs: O Ministério da Saúde Adverte. Não use um desses direto no
> prompt
> > > pois
> > > > seu terminal será trancado.
> > > >
> > > > Cordialmente,
> > > >
> > > > Julio Neves
> > > > *Quer programar bem em Shell?
> > > > *
> > > >
> > > > *Use este endereço de e-mail, o Skype ou ☎ (21)8112-9988 ☎*
> > > >
> > > > *
> > > > *
> > > >
> > > > **
> > > >
> > > > *
> > > > *
> > > > My profiles: [image: Twitter] <http://twitter.com/juliobash>
> > >
> > > > Contact me: [image: Skype] julioneves1
> > > > Em 1 de setembro de 2011 10:56, Rodrigo R. Martins
> > > > <address@hidden>escreveu:
> > > >
> > > > > **
> > > >
> > > > >
> > > > >
> > > > > Ah, sim... :)
> > > > >
> > > > > Então, na verdade é como estava lá no trecho que eu postei da
> > > > documentação
> > > > > sobre file descriptors... o shell faz uma pré-checagem e retorna um
> > > > warning
> > > > > antes do teste que você espera que o script faça em si.
> > > > >
> > > > > Ele comenta sobre usar parenteses, mas com comandos simples até
> > rolou,
> > > > mas
> > > > > quando são compostos como é o caso do "which" não rolou...
> > > > >
> > > > > Quem sabe alguém mais da velha guarda já viu esse problema antes e
> > > > > conseguiu
> > > > > contornar de algum jeito mais elegante.
> > > > >
> > > > > Valeu, pessoal.
> > > > >
> > > > > Abraços,
> > > > >
> > > > > Em 1 de setembro de 2011 19:32, Fernando Mercês <address@hidden
> > > > > >escreveu:
> > > > >
> > > > >
> > > > > > Entendi. Eu não sabia dessa, mas me parece coisa velha, ainda
> mais
> > se
> > > > > > tratando do Solaris 5.9. É bem antigo.
> > > > > >
> > > > > > Você tem certeza que não tem bash em todas as máquinas? Eu
> entendo
> > > este
> > > > > > "medo" mas ainda não vi um UNIX sem bash atualmente. Bem, é só um
> > > > > > sentimento.
> > > > > >
> > > > > > O which retorna erro? Aqui no Linux não. Então daria pra fazer
> > > direto:
> > > > > >
> > > > > > ---
> > > > > > if which cmd > /dev/null; then
> > > > > > echo ok
> > > > > > else
> > > > > > echo not found
> > > > > > fi
> > > > > > ---
> > > > > >
> > > > > > Perceba que você não precisa de uma variável pra testar no if, já
> > que
> > > > ele
> > > > > > testa comandos. ;-)
> > > > > >
> > > > > > Abraço!
> > > > > >
> > > > > > Att,
> > > > > >
> > > > > > Fernando Mercês
> > > > > > Linux Registered User #432779
> > > > > > www.mentebinaria.com.br
> > > > > > softwarelivre-rj.org
> > > > > > @MenteBinaria
> > > > > > ------------------------------------
> > > > > > Participe do I Hack'n Rio
> > > > > > hacknrio.org
> > > > > > ------------------------------------
> > > > > >
> > > > > >
> > > > > > 2011/9/1 Rodrigo R. Martins <address@hidden>
> > > > > >
> > > > > > > **
> > > > > > >
> > > > > > >
> > > > > > > Fala Fernando, blz?
> > > > > > >
> > > > > > > Não, cara... na verdade eu encontrei uma literatura que me
> ajudou
> > > um
> > > > > > pouco
> > > > > > > a
> > > > > > > entender o que de fato está acontecendo[1]:
> > > > > > >
> > > > > > > "On the other hand, some shells, such as Solaris or FreeBSD
> > > /bin/sh,
> > > > > warn
> > > > > > > about missing programs before performing redirections.
> Therefore,
> > > to
> > > > > > > silently check whether a program exists, it is necessary to
> > perform
> > > > > > > redirections on a subshell:
> > > > > > >
> > > > > > > $ /bin/sh -c 'nosuch 2>/dev/null'
> > > > > > > nosuch: not found
> > > > > > > $ /bin/sh -c '(nosuch) 2>/dev/null'
> > > > > > > $ bash -c 'nosuch 2>/dev/null'
> > > > > > >
> > > > > > > "
> > > > > > >
> > > > > > > Ou seja... entendo que o shell tenta emitir a mensagem de
> > > > erro/warning
> > > > > > > antes
> > > > > > > mesmo de repassar a saída pro bendito file descriptior...
> > > > > > >
> > > > > > > Já fiz alguns testes e ainda continuo, mas não obtive
> sucesso...
> > > Olha
> > > > > > só...
> > > > > > > o objetivo maior neste momento é evitar que no meu script emita
> > > > > mensagens
> > > > > > > de
> > > > > > > erro quando não achar um binário qualquer. Estou usando
> > Sun/Solaris
> > > > > 5.9.
> > > > > > >
> > > > > > > testing=`which command_testing 2>/dev/null`
> > > > > > >
> > > > > > > if [ -n "$testing" ]; then
> > > > > > > command_testing -xpto
> > > > > > > else
> > > > > > > echo "[!] Command testing was not found"
> > > > > > > fi
> > > > > > >
> > > > > > > Com bash funciona de boa, mas eu não posso contar que em todas
> as
> > > > > > máquinas
> > > > > > > vai existir o bash instalado...
> > > > > > >
> > > > > > > Acontece que não há nada que eu consiga fazer pra evitar os
> > > warnings
> > > > na
> > > > > > > tela... enfim.
> > > > > > >
> > > > > > > Abraços,
> > > > > > >
> > > > > > > Rodrigo Martins
> > > > > > >
> > > > > > > [1]
> > > http://www.gnu.org/s/hello/manual/autoconf/File-Descriptors.html
> > > > > > >
> > > > > > > Em 1 de setembro de 2011 17:27, Fernando Mercês <
> > address@hidden
> > > > > > > >escreveu:
> > > > > > >
> > > > > > >
> > > > > > > > Estranho... o número que precede o ">" é o file descriptor
> que
> > > você
> > > > > > quer
> > > > > > > > redirecionar. Será que esse shell (que deve ser o sh) não
> está
> > > > > > escrevendo
> > > > > > > > tanto em stderr quanto em stdout? Tenta:
> > > > > > > >
> > > > > > > > $ svcs 2>&1 > /dev/null
> > > > > > > >
> > > > > > > > Abraço.
> > > > > > > >
> > > > > > > > Att,
> > > > > > > >
> > > > > > > > Fernando Mercês
> > > > > > > > Linux Registered User #432779
> > > > > > > > www.mentebinaria.com.br
> > > > > > > > softwarelivre-rj.org
> > > > > > > > @MenteBinaria
> > > > > > > > ------------------------------------
> > > > > > > > Participe do I Hack'n Rio
> > > > > > > > hacknrio.org
> > > > > > > > ------------------------------------
> > > > > > > >
> > > > > > > >
> > > > > > > > 2011/9/1 Rodrigo R. Martins <address@hidden>
> > > > > > > >
> > > > > > > > > **
> > > > > > > > >
> > > > > > > > >
> > > > > > > > > Pessoal,
> > > > > > > > >
> > > > > > > > > Estou fazendo alguns testes com Solaris, e estou tendo
> alguns
> > > > > > problemas
> > > > > > > > > para
> > > > > > > > > canalizar mensagens de erros para evitar poluir a tela caso
> > > algo
> > > > > saia
> > > > > > > > > diferente do esperado.
> > > > > > > > >
> > > > > > > > > Notei que qualquer comando ou sintaxe que não exista, ele
> > > > > obviamente
> > > > > > > > > reclama
> > > > > > > > > com uma mensagem de erro mas eu não conseguir achar um meio
> > de
> > > > > > > controlar.
> > > > > > > > > Exemplo:
> > > > > > > > >
> > > > > > > > > # svcs
> > > > > > > > > svcs: not found
> > > > > > > > >
> > > > > > > > > # svcs 2>/dev/null
> > > > > > > > > svcs: not found
> > > > > > > > >
> > > > > > > > > Se eu tentar com bash ou kornshell, tudo funciona
> > > perfeitamente.
> > > > > > > Exemplo:
> > > > > > > > >
> > > > > > > > > bash-2.05# svcs
> > > > > > > > > bash: svcs: command not found
> > > > > > > > >
> > > > > > > > > bash-2.05# svcs 2>/dev/null
> > > > > > > > >
> > > > > > > > > Saberiam me dizer o porque?
> > > > > > > > >
> > > > > > > > > Desde já agradeço.
> > > > > > > > >
> > > > > > > > > Abraços,
> > > > > > > > >
> > > > > > > > > Rodrigo
> > > > > > > > >
> > > > > > > > > [As partes desta mensagem que não continham texto foram
> > > > removidas]
> > > > > > > > >
> > > > > > > > >
> > > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > > [As partes desta mensagem que não continham texto foram
> > > removidas]
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > > ------------------------------------
> > > > > > >
> > > > > > > >
> > > > > > > > ----------------------------------------------------------
> > > > > > > > Esta lista não admite a abordagem de outras liguagens de
> > > > programação,
> > > > > > > como
> > > > > > > > perl, C etc. Quem insistir em não seguir esta regra será
> > moderado
> > > > sem
> > > > > > > prévio
> > > > > > > > aviso.
> > > > > > > > ----------------------------------------------------------
> > > > > > > > Sair da lista: address@hidden
> > > > > > > > ----------------------------------------------------------
> > > > > > > > Esta lista é moderada de acordo com o previsto em
> > > > > > > > http://www.listas-discussao.cjb.net
> > > > > > > > ----------------------------------------------------------
> > > > > > > > Servidor Newsgroup da lista: news.gmane.org
> > > > > > > > Grupo: gmane.org.user-groups.programming.shell.brazil
> > > > > > > >
> > > > > > > > Links do Yahoo! Grupos
> > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > > > [As partes desta mensagem que não continham texto foram
> > removidas]
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > >
> > > > > >
> > > > > > [As partes desta mensagem que não continham texto foram
> removidas]
> > > > > >
> > > > > >
> > > > > >
> > > > > > ------------------------------------
> > > > > >
> > > > > > ----------------------------------------------------------
> > > > > > Esta lista não admite a abordagem de outras liguagens de
> > programação,
> > > > > como
> > > > > > perl, C etc. Quem insistir em não seguir esta regra será moderado
> > sem
> > > > > prévio
> > > > > > aviso.
> > > > > > ----------------------------------------------------------
> > > > > > Sair da lista: address@hidden
> > > > > > ----------------------------------------------------------
> > > > > > Esta lista é moderada de acordo com o previsto em
> > > > > > http://www.listas-discussao.cjb.net
> > > > > > ----------------------------------------------------------
> > > > > > Servidor Newsgroup da lista: news.gmane.org
> > > > > > Grupo: gmane.org.user-groups.programming.shell.brazil
> > > > > >
> > > > > > Links do Yahoo! Grupos
> > > > > >
> > > > > >
> > > > > >
> > > > >
> > > > > [As partes desta mensagem que não continham texto foram removidas]
> > > > >
> > > > >
> > > > >
> > > >
> > > > [As partes desta mensagem que não continham texto foram removidas]
> > > >
> > > >
> > > >
> > >
> > > [As partes desta mensagem que não continham texto foram removidas]
> > >
> > >
> > >
> >
> > [As partes desta mensagem que não continham texto foram removidas]
> >
> >
> >
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>  
>


[As partes desta mensagem que não continham texto foram removidas]



reply via email to

[Prev in Thread] Current Thread [Next in Thread]