Ajuda com Shell Script + Saida de Erros

Iniciado por frank_w, 29 de Junho de 2008, 21:47

tópico anterior - próximo tópico

frank_w

Boa Noite,

Eu estou com um problema em meu programa, onde tento instalar programas por meio de cache local. Até ai tudo bem, o problema acontece quando eu direciono a saida de erros para um arquivo de log, para poder analizar depois. Exemplo:

Citarapt-get install -y force-yes audacious audacious-plugins 2>> /tmp/log_de_erro.log | zenity --progress --text="Instalando player Audacious" --pulsate

ao final da instalação, quando o programa analisa o conteudo do possivel log, ele sempre encontra o mesmo erro: "dpkg-preconfigure: Impossivel reabrir stdin:". O estranho é que quando eu tiro a parte de redirecionar o erro ele nao da erro nenhum, ou pelo menos eu nao vejo erro nenhum, e o programa esta la no menu funcionando.

Ja tentei rodar o comando em terminal sem o zenity:
Citarapt-get install -y force-yes audacious audacious-plugins 2>> /tmp/log_de_erro.log

E aparentemente ele instala normal e mostra "Now deferred place sei-lah oque...", porem quando digito:
Citarcat /tmp/log_de_erro.log
ele mostra que teve problemas:
Citardpkg-preconfigure: Impossivel reabrir stdin:

Se alguem souber oque pode estar acontecendo, por favor post aqui. Ficarei Grato.

brunei

Olá frank_w,

Estive olhando o fonte do dpkg-preconfigure, que é um script perl. Ao que eu vi ele suporta vários frontend's para receber as informações de entrada, e quando você roda via um script ele tenta abrir o STDIN para receber entradas via console, mas não consegue (talvezpor que no script ele esteja rodando em modo batch e não modo interativo, não posso afirmar ao certo). Não sei se você tentou executar o comando sem o redirecionamento da saída, mas acredito que mesmo que o dpkg-preconfigure não lhe faça nenhuma pergunta, ele tentará abrir um frontend.

Vou dar uma pesquisada quando eu estiver no Linux (estou no Window$ agora) e qualquer novidade eu te informo.

Até...
Bruno Ribeiro

frank_w

Obrigado pela ajuda!

Pelo jeito vou ter que achar outra maneira de verificar se os pacotes foram instalados corretamente. Ou criar uma espécie de filtro que ignore a linha do "stdin" do arquivo de log.

a proposito voce saberia me dizer se há uma meneira de checar a instalação dos pacotes? Será que há como usar a lista de pacotes do apt?

Valeu

brunei

Frank_w,

Você pode saber se um pacote está instalado através do comando:

dpkg -s nome_do_pacote

Quando o pacote não existe, o comando acima não escreve nada na saída padrão (mas deixa uma mensagem de erro na saída padrão de erros). Sendo assim, você pode escrever um script contendo o seguinte fragmento de código


ESTADO=`dpkg -s nome_do_pacote 2> /dev/null`
if [ ! -z "$ESTADO" ]; then
    echo "O pacote está instalado!"
fi


Nota: o redirecionamento 2> permite-nos desviar a saída padrão de erro para o dispositivo null.
Bruno Ribeiro

frank_w

Muito Obrigado!

Acho que agora vou conseguir terminar o meu script. Se ficar bom eu disponibilizo aqui no forum.

Mais uma vez obrigado pela atenção.

sprit

Tenha cuidado com as dependencias, alguns arquivos depende de outros antes de instala.