/ Forside / Teknologi / Operativsystemer / Linux / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Linux
#NavnPoint
o.v.n. 11177
peque 7911
dk 4814
e.c 2359
Uranus 1334
emesen 1334
stone47 1307
linuxrules 1214
Octon 1100
10  BjarneD 875
Exit i scripts
Fra : Dennis


Dato : 15-08-03 10:02

Jeg har et script som automatisk opdatere min FreeBSD til nyeste stable
release, men har et problem med, at FreeBSD af og til ikke kan opdateres
pga. der kommer en "Stop code" (måske pga. problemer med FreeBSD sitet eller
source-filen eller andet).

Det er meget uheldigt, at mit script bare fortsætter selv om der er kommet
en stop, for det resultere altså i, at den bare køre videre og laver en
masse som den ikke skal (og i worst case betyder det ominstallering af
FreeBSD - prøvede det igår!).

Mit spørgsmål går på - hvordan kontrollere jeg om der er kommet en EXIT
eller STOP, så jeg kan afbryde mit script? Det er bash og FreeBSD (begge i
nyeste version).

Her er et uddrag af mit script:

....

if [ $? == 0 ] ; then
echo "BUILDKERNEL 2/5" | /usr/bin/tee -a $logfile
cd /usr/src/sys/i386/conf/
config kern | /usr/bin/tee -a $logfile
fi

if [ $? == 0 ] ; then
echo "BUILDKERNEL 3/5" | /usr/bin/tee -a $logfile
cd /usr/src/sys/compile/kern/
make depend | /usr/bin/tee -a $logfile
fi

....

Men ovenstående virker altså ikke, da den fortsætter alligevel selvom der
kommer en Stop.

Dennis



 
 
Morten (15-08-2003)
Kommentar
Fra : Morten


Dato : 15-08-03 14:16


Er ikke helt sikker på at jeg forstår hvor den kører videre, men mener du:

> if [ $? == 0 ] ; then
> echo "BUILDKERNEL 2/5" | /usr/bin/tee -a $logfile
> cd /usr/src/sys/i386/conf/
> config kern | /usr/bin/tee -a $logfile
else
exit $?
> fi

Eller skal der tests på om det er config der fejler?

Morten


Dennis (15-08-2003)
Kommentar
Fra : Dennis


Dato : 15-08-03 22:21

> Er ikke helt sikker på at jeg forstår hvor den kører videre, men mener du:
>
> > if [ $? == 0 ] ; then
> > echo "BUILDKERNEL 2/5" | /usr/bin/tee -a $logfile
> > cd /usr/src/sys/i386/conf/
> > config kern | /usr/bin/tee -a $logfile
> else
> exit $?
> > fi
>
> Eller skal der tests på om det er config der fejler?

Den skal stoppe scriptet fuldstændigt, hvis der er opstået en fejl
undervejs. Den plejer bare at fortsætte (den ignorere if-sætningen eller
rettere.. if-sætningen er sikkert forkert).

Dennis



Peter Makholm (15-08-2003)
Kommentar
Fra : Peter Makholm


Dato : 15-08-03 22:37

"Dennis" <spam@snudske.dk> writes:

> Jeg har et script som automatisk opdatere min FreeBSD til nyeste stable
> release, men har et problem med, at FreeBSD af og til ikke kan opdateres
> pga. der kommer en "Stop code" (måske pga. problemer med FreeBSD sitet eller
> source-filen eller andet).

Hvad mener du med 'Stop code'?

Du kunne måske skrive 'set -e' i begyndelsen af dit script. Så stopper
scriptet hvis en komando der ikke indgår i en test, returnerer andet
end 0.

--
Peter Makholm | Have you ever felt trapped inside a Klein bottle?
peter@makholm.net |
http://hacking.dk |

Dennis (15-08-2003)
Kommentar
Fra : Dennis


Dato : 15-08-03 23:57

> Hvad mener du med 'Stop code'?

Uddrag af logfil:

[CUT]

BUILDWORLD 2/5
Running test variables
PASS: Test variables detected no regression, output matches.
Running test targets
PASS: Test targets detected no regression.
Running test sysvmatch
PASS: Test sysvmatch detected no regression.
Running test lhs_expn
FAIL: Test failed: regression detected. See above.
*** Error code 1

Stop in /usr/src/tools/regression/usr.bin/make.
*** Error code 1

Stop in /usr/src/tools/regression/usr.bin/make.

--------------------------------------------------------------
Building an up-to-date make(1)
--------------------------------------------------------------
rm -f .depend
mkdep -f
..depend -a -I/usr/src/usr.bin/make -DMAKE_VERSION=\"5200209170\" -D__FBSD
ID=__RCSID -DDEFSHELL=1 /usr/src/usr.bin/make
echo make: /usr/lib/libc.a >> .depend
cc -O -pipe -I/usr/src/usr.bin/make -DMAKE_VERSION=\"5200209170\" -D__FBSDID
=__RCSID -DDEFSHELL=1 -c /usr/src/usr.bin/make/arch.

[CUT]

Den burde jo, efter min mening, stoppe videre udførsels af scriptet, når der
kommer sådan en Error code.

> Du kunne måske skrive 'set -e' i begyndelsen af dit script. Så stopper
> scriptet hvis en komando der ikke indgår i en test, returnerer andet
> end 0.

Det vil jeg prøve.

Dennis



Michael Hjorth (15-08-2003)
Kommentar
Fra : Michael Hjorth


Dato : 15-08-03 22:38

On Fri, 15 Aug 2003 11:01:46 +0200, Dennis wrote:

> Jeg har et script som automatisk opdatere min FreeBSD til nyeste stable
> release, men har et problem med, at FreeBSD af og til ikke kan opdateres
> pga. der kommer en "Stop code" (måske pga. problemer med FreeBSD sitet
> eller source-filen eller andet).
>
> Det er meget uheldigt, at mit script bare fortsætter selv om der er
> kommet en stop, for det resultere altså i, at den bare køre videre og
> laver en masse som den ikke skal (og i worst case betyder det
> ominstallering af FreeBSD - prøvede det igår!).
>
> Mit spørgsmål går på - hvordan kontrollere jeg om der er kommet en EXIT
> eller STOP, så jeg kan afbryde mit script? Det er bash og FreeBSD (begge
> i nyeste version).
>
> Her er et uddrag af mit script:
>
> ...
>
> if [ $? == 0 ] ; then
> echo "BUILDKERNEL 2/5" | /usr/bin/tee -a $logfile
> cd /usr/src/sys/i386/conf/
> config kern | /usr/bin/tee -a $logfile
> fi
>
> if [ $? == 0 ] ; then
> echo "BUILDKERNEL 3/5" | /usr/bin/tee -a $logfile
> cd /usr/src/sys/compile/kern/
> make depend | /usr/bin/tee -a $logfile
> fi
>
> ...
>
> Men ovenstående virker altså ikke, da den fortsætter alligevel selvom
> der kommer en Stop.

Hvor kommer der et stop?? Der mangler da en exit kommando et eller andet
sted for at den kan stoppe scriptet.

Burde du ikke skrive noget i retning af:

make et_eller_andet_program
rc=$?
if [ $rc -ne 0 ]
then
echo "make et_eller_andet_program fejlede med returkoden $rc"
exit $rc
fi

Michael.

Dennis (15-08-2003)
Kommentar
Fra : Dennis


Dato : 15-08-03 23:59

> > if [ $? == 0 ] ; then
> > echo "BUILDKERNEL 2/5" | /usr/bin/tee -a $logfile
> > cd /usr/src/sys/i386/conf/
> > config kern | /usr/bin/tee -a $logfile
> > fi
>
> Burde du ikke skrive noget i retning af:
> make et_eller_andet_program
> rc=$?
> if [ $rc -ne 0 ]
> then
> echo "make et_eller_andet_program fejlede med returkoden $rc"
> exit $rc
> fi

Måske dette istedet (så man slipper for at sætte en variabel):

if [ $? -ne 0 ] ; then
echo "BUILDKERNEL 2/5" | /usr/bin/tee -a $logfile
cd /usr/src/sys/i386/conf/
config kern | /usr/bin/tee -a $logfile
fi

Det vil jeg prøve.

Dennis



Michael Hjorth (17-08-2003)
Kommentar
Fra : Michael Hjorth


Dato : 17-08-03 09:46

On Sat, 16 Aug 2003 00:59:20 +0200, Dennis wrote:



> Måske dette istedet (så man slipper for at sætte en variabel):
>
>
Da $? er en meget flygtig variabel gemmer jeg den altid i en anden
variabel.

> if [ $? -ne 0 ] ; then
> echo "BUILDKERNEL 2/5" | /usr/bin/tee -a $logfile
> cd
> /usr/src/sys/i386/conf/
> config kern | /usr/bin/tee -a $logfile
> fi
>
>
Det virker som om du har misforstået hvordan fejlhåndtering i shell
fungerer? Et shell script returnerer en fejlkode i $?, men hvis du ikke
tester på den og kalder en exit kommando så kører scriptet uantastet
videre med næste kommando. Dette er nomal opførsel, men hvis du bruger set
-e, som Peter nævner i sit svar, ændrer du shellens måde at reagere på
fejl, så stopper den scriptet hvis der opstår en fejl.

Du kan selvfølgelig også pakke resten af scriptet ind i if sætninger, og
på den måde undgå exit kommandoen. Jeg synes det bliver lidt klodset, men
det er jo en smagssag.

Michael.

Leif Neland (16-08-2003)
Kommentar
Fra : Leif Neland


Dato : 16-08-03 18:41


"Dennis" <spam@snudske.dk> skrev i en meddelelse
news:3f3ca17b$0$13174$edfadb0f@dread15.news.tele.dk...
> Jeg har et script som automatisk opdatere min FreeBSD til nyeste stable
> release, men har et problem med, at FreeBSD af og til ikke kan opdateres
> pga. der kommer en "Stop code" (måske pga. problemer med FreeBSD sitet
eller
> source-filen eller andet).
>
Jeg har blot en enkelt linie:

[ cvsupdate med parametre, jeg ikke kan huske ] && cd /usr/src && make
buildworld && make installworld && make buildkernel && make installkernel &&
reboot

Leif



Søg
Reklame
Statistik
Spørgsmål : 177560
Tips : 31968
Nyheder : 719565
Indlæg : 6408952
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste