|
| 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
| |
|
|