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

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

[shell-script] Re: Script sai quando não devia


From: mop
Subject: [shell-script] Re: Script sai quando não devia
Date: Sat, 01 Dec 2007 10:41:48 -0200

Limpei e deixei o essencial na sua mensagem abaixo.
Sugiro que faça o mesmo se quiser que as pessoas leiam.
Tudo o que ocorre dentro dos subscript não tem importância,
a menos que a execução não retorne dele.

Perfeito, o set -x fez o serviço.
O que eu precisava saber está nestas duas linhas:
>+ read escolha
>+ cd ../..

Ou seja, o script sempre executou o read antes de sair, pelo menos nestes dois
testes relatados. Já ficou bem mais fácil. Eu arriscaria dizer que há reads
nesses scripts lendo a partir de fd0 (stdin) do MESMO terminal. Daí não
interessa onde estão, nem se são executados em subshell ou como source.

Retire o set -x, ele não vai mais ajudar, só atrapalhar.

antes do while escreva:
escolhas="$escolhas
1
2
3
4
5
6
7
8
9" # para ter mais entradas :)

Não tenho outra idéia para teste a não ser insirindo imediatamente antes do
"done":
echo -ne "----\n$escolhas\n----\nexecutado: |$escolha|  press enter";read<&2

Veja que estou usando um read dentro do  loop, mas não estou lendo o fd0 (&0).
Selecione todas as suas opções, quanto mais melhor.
Cada vez que o script chegar ao final do conteúdo do loop imprimirá a variável
usada e a lista. Se estiver com sorte deverá ver saltos durante a execução, ou
seja o ponteiro do read está sendo avançado nos subscripts, acarretando saltos
na lista das opções marcadas.

A seguir substitua o while por for, acho que o IFS está ok:
for escolha in $escolhas
#echo "$escolhas" | while read escolha

Reexecute. 

Não ponho minha mão no fogo pois a certeza não é 100%, mas eu arriscaria 99.
Aconteceu o que você queria?
Caso afirmativo estará confirmado, pode tentar verificar com:
grep 'read ' *
se existe o comando read nos seus subscripts, ou outros que eles chamem.

Recentemente eu postei sobre isso, inclusive com exemplo lendo os 3 fds do
shell, só que se não me engano o problema era exatamente o opstodo seu.

Não seja imediatista, substituindo o "while" pelo "for" e pronto.
Faça pelo menos a sequencia com a impressão da variável ou não fixará tão
bem esses detalhes.

Se der certo ainda economizou um tubo, o "|", além dos " ( ) ". :)



------------------------------------------------------------------
>From: "miguelcm86"

>+ read escolha
>+ case $escolha in
>+ . ./d4x.sh
>++ place=/home/miguel/install/Option/Base/
>++ sudo aptitude -y install d4x
>++ return 0
>+ read escolha
>+ case $escolha in
>+ . ./amule.sh
>++ place=/home/miguel/install/Option/Base/
>++ sudo aptitude -y install amule
>++ return 0
>+ read escolha
>+ cd ../..
>+ exit 0
>------------------------------------------------------------------
>segundo teste só instalou um programa, aqui imprimi a lista que
>seleccionei no xdialog:
>+ echo 'Firestarter
>AcetoneISO2
>IE4linux
>Audacity
>Kino
>Thunderbird
>Sunbird
>Dia
>K3b
>Skype
>KDE'
>+ read escolha
>+ case $escolha in
>+ . ./firestarter.sh
>++ place=/home/miguel/install/Option/Base/
>++ sudo aptitude -y install firestarter
>++ return 0
>+ read escolha
>+ cd ../..
>+ exit 0
>----------
>isto por acaso já me tinha acontecido, uma hora dá uns poucos, outra
>hora só dá alguns ou 1...



reply via email to

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