On Sun, Apr 8, 2012 at 5:44 AM, Jorge Barros de Abreu
<[email protected]> wrote:
>
> Olá.
>
> Tenho o seguinte script.sh:
>
> #!/bin/sh
> ping -i 2 127.0.0.1 1>/dev/null &
> read -n 1
> sudo /bin/kill `sudo /sbin/pidof ping` 1>&- 2>&-

Por que tu fecha os file descriptors do stdout e stderr ao invés de
simplesmente mandá-los para o /dev/null?

Eu nunca vi fazer isto que tu faz com estes dois file descriptors [em
um shell script]. O uso mais comum que eu vi para querer fechar um
file descriptor é quando tu cria um para funcionar como um "named
pipe", algo tipo:

---- 8< ----
# abre /var/log/meulog para leitura e escrita e atribui o file
descriptor 3 ao mesmo
exec 3<>/var/log/meulog

# joga stdout para o file descriptor 3 enquanto roda comando_qualquer
comando_qualquer >&3

# executa o comando "parser_de_log" que lê o log no file descriptor 3
parser_de_log <&3

# fecha o file descriptor 3
exec 3>&-
---- >8 ----


Na verdade, eu não sei nem se dá pra fechar um file descriptor num
comando normal, eu sempre achei que só podia em um "exec".

A propósito, tu pode usar o pkill ou o killall e ai não precisa mais
usar o sudo para matar um processo que tu mesmo iniciou.



> read -n 1
> sleep 5
>
> -ao fazer "sh script.sh" em um terminal/konsole eu obtenho a seguinte 
> mensagem:
>
> script.sh: line 6:  5609 Terminado               ping -i 2 127.0.0.1 > 
> /dev/null

Off topic: Tenta usar C ao invés do teu locale nos scripts; os locales
não só costumam deixar as coisas um pouco mais lentas como as vezes
eles são os principais culpados por problemas com tratamento de
entrada e saída de comandos.



> -ao fazer "sh script.sh 2>/dev/null"

Pode ser alguma "funcionalidade" do bash rodando no modo de
compatibilidade. Quando tu executa o bash como sh, ele entra no modo
de compabilidade e no Slackware o /bin/sh é um link simbólico para
/bin/bash.

Se tu executar "bash script.sh 2>/dev/null", o que acontece? Meu
palpite é que o ocorre o mesmo que no xterm.



> a mensagem some - OK.
>
> -mas ao fazer "xterm -e sh script.sh 2>/dev/null"
>
> a mensagem retorna.
>
> Preciso retirar essa mensagem do xterm.
> Os redirecionamentos de stdout e stderr estão sendo ignorados pelo referido 
> xterm.

Provavelmente deve ser porque tu fecha os file descriptors ao invés de
jogar para o /dev/null? Um strace deve dizer melhor o que acontece
(olha os fopen/fclose).



> Eu sei que existem outras formas de retirar a mensagem como "grep -v" mas o 
> fato inusitado de o xterm
> ignorar os redirecionamentos me chama a atenção.

Acho que não é necessáriamente o xterm e sim o bash. De qualquer forma
eu não uso nenhum dos dois há muito tempo, eu não sei explicar
exatamente o por quê deste comportamento -- só palpites. :)

-- 
GUS-BR - Grupo de Usuários de Slackware Brasil
http://www.slackwarebrasil.org/
http://groups.google.com/group/slack-users-br

Antes de perguntar:
http://www.istf.com.br/perguntas/

Para sair da lista envie um e-mail para:
[email protected]

Responder a