Toon posts:

[BASH] Probleem met echo > bestand

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een backup script gemaakt. Deze functioneert perfect. Echter backupt dit script dingen van een VB programma. Nu leest dit script een waarde uit een ini bestand. En met die waarde wil ik laten bepalen om de hoeveel tijd de backup plaatsvind.

Wat ik gedaan heb:
code:
1
echo $TIMER * * * * /home/backup/backup.scr > crontab.scr

Heb ik in het backup script staan. Waar timer de variabele backup tijd is.
Alleen werkt dit niet. voor de * wordt de directory listing gegeven.
Zoals je ziet wordt de crontab regel naar crontab.scr geschreven. Dit script zal in de crontab komen te staan.
Dus als het backup script draait wordt een nieuwe waarde uit TIMER gehaald en deze in de crontab gezet. Hierdoor is de crontab variabel.

Echter schrijft bovenstaand commando niet weg wat ik wil hebben. Het geen ik in crontab.scr wil hebben is het volgende. Waarbij 4 de waarde is van TIMER.
code:
1
4 * * * * /home/backup/backup.scr


Met het gebruik van quotes lukt het mij niet om de waarde van TIMER voor de rest te krijgen.

Hoe kan ik dit oplossen?

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Je zult op zijn minst 1 string moeten echoen...
"$TIMER * * * * ... "

Verwijderd

Topicstarter
Dat dacht ik in eerste instantie ook. Echter gebruikt hij dan de variabele niet.
Hetgeen wat dan in het bestand komt te staan is.
code:
1
* * * * /home/backup/backup.scr


Daar snapte ik dus weinig van.

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

code:
1
2
3
4
5
[acm@vulcanus acm]$ TIMER=`date`;
[acm@vulcanus acm]$ echo $TIMER
Sat Jan 11 19:51:14 CET 2003
[acm@vulcanus acm]$ echo "$TIMER"
Sat Jan 11 19:51:14 CET 2003

Werkt hier prima, dus je $TIMER zal geen waarde hebben op die plek waar jij hem gebruikt?

Verwijderd

Topicstarter
Ok, dat werkt bij mij ook wel.
Hetgeen wat alleen niet werkt is dat ik het goed weg krijg naar het bestand. Waar dat precies aan ligt weet ik neit.
code:
1
2
mars:/home/backup# echo "$TIMER * * * * /home/backup/backup.scr"
4 * * * * /home/backup/backup.scr


Dat ziet er perfect uit.
Echter heb ik hiervoor wel een export TIMER=4 heb gedaan.

Nu is in mijn script timer 4. Dit heb ik met een simpele
code:
1
echo $TIMER

getest.
Echter bij het uitvoeren van deze regel in mijn script.
code:
1
echo $TIMER * * * * /home/backup/backup.scr > crontab.scr

wordt het niet goed ingevuld in het output bestand.

Ik vind het erg vreemd.

  • Red Sonja
  • Registratie: Juli 2001
  • Laatst online: 03-05 19:27

Red Sonja

Linux: power to de wortel


redsonja@linux$ echo $TIMER

redsonja@linux$ export TIMER=4
redsonja@linux$ echo $TIMER
4
redsonja@linux$ echo "$TIMER * * * * /home/backup/backup.scr" > test.scr
redsonja@linux$ ls -l test.scr
-rw-r--r-- 1 gsm gsm 34 Jan 11 20:48 test.scr
redsonja@linux$ cat test.scr
4 * * * * /home/backup/backup.scr
redsonja@linux$

Dat werkt gewoon...

redsonja@linux$ echo "echo \"\$TIMER * * * * /home/backup/backup.scr\" > test.scr" > test.sh
redsonja@linux$ /bin/bash ./test.sh
redsonja@linux$ ls -l test.scr
-rw-r--r-- 1 redsonja users 34 Jan 11 20:51 test.scr
redsonja@linux$ cat test.sh
echo "$TIMER * * * * /home/backup/backup.scr" > test.scr
redsonja@linux$ cat test.scr
4 * * * * /home/backup/backup.scr

Je doet toch echt iets fout dan.... :?

And the beast shall be made legion. Its numbers shall be increased a thousand thousand fold. The din of a million keyboards like unto a great storm shall cover the earth, and the followers of Mammon shall tremble. from The Book of Mozilla, 3:31


Verwijderd

Topicstarter
Wat jij doet levert bij mij ook totaal geen problemen op.
Echter als ik het in een script zet werkt het niet. En dat vind ik vreemd.

Want dan mist bij mij de variabele. Terwijl als ik die gewoon afdruk in het script het geen probleem oplevert.
De uitvoer is dan:

Timer: 4
In het bestand staat echter dit: :?
* * * * /home/backup/backup.scr

Ik ben geen held in scripten maar snap de basis wel. En ik heb geen idee waarom het vanaf de prompt zonder problemen werkt en in het script niet.
Het enige wat ik kan bedenken is dat de variabele niet goed ingezet wordt. Waarom, geen idee.
Ik hoop dat iemand hier er iets van begrijpt want ik ben totaal de kluts kwijt.......

  • odysseus
  • Registratie: Augustus 2000
  • Laatst online: 20:19

odysseus

Debian GNU/Linux Sid

Zou je het betreffende stuk script kunnen posten? Dus alles van het zetten van de variabele tot en met het uitvoeren van die echo, aangenomen dat het geen honderden regels zijn :).

Leven is het meervoud van lef | In order to make an apple pie from scratch, you must first create the universe.


Verwijderd

Topicstarter
Het script zelf is enorm klein.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
#
DATE=`date +%T`
OUT="/home/backup" # Waar moet de backup komen te staan.
IN="/home/data/*"  # Wat moet er gebackupped worden.
TIMER=`cat /home/data/SETTINGS.INI | grep Backup | tail -c 3`

echo ""
echo "Start backup" $DATE
tar cfzP $OUT/backup.`date +%H.%M.%S`.tar.gz $IN
echo "Einde backup" $DATE
echo "Timer:" $TIMER
echo ""
echo "$TIMER * * * * /home/backup/backup.scr" > crontab.scr


Ikzelf heb het gevoel dat bij de laatste regel TIMER wordt bekeken als environment variabele. Maar hoe dat op te lossen als dat het geval is?

  • Red Sonja
  • Registratie: Juli 2001
  • Laatst online: 03-05 19:27

Red Sonja

Linux: power to de wortel

export TIMER
Voordat je 'm in dat bestand wegschrijft?

And the beast shall be made legion. Its numbers shall be increased a thousand thousand fold. The din of a million keyboards like unto a great storm shall cover the earth, and the followers of Mammon shall tremble. from The Book of Mozilla, 3:31


Verwijderd

Topicstarter
Met die regel voor de regel welke wegschrijft krijg ik nog steeds hetzelfde in het weggeschreven bestand. :(

Verwijderd

Waarschijnlijk is het probleem dat je een nieuwe bash voor je scriptje opstart. Die export functie zet dan
de timer variabel in je nieuwe bash script, wanneer dit bash script eindigt is dan ook jouw variabel kwijt.
De beste oplossing is om geen nieuwe bash op te starten (dus de eerste regel:
#!/bin/bash te verwijderen).

Verwijderd

Lijkt me niet die variable TIMER wordt zelf in het script gezet.. btw dat scriptje heb ik uitgeprobeerd en het werkt prima (Had alleen de TIMER zo gezet TIMER = `echo "3"` en verder de tar uitgezet)

Verwijderd

Topicstarter
Het gekke is dat het niet werkt.....

Heeft iemand enig idee waarom het niet werkt?

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

export TIMER hoeft niet, en dat er een nieuw proces gestart wordt is niet erg, laat die #!/bin/bash maar lekker staan. De variabele wordt namelijk in 1 proces gemaakt en gebruikt.

En bij mij werkt je script wel :?
Bij tijnbraun ook, het lijkt me dat het dus niet met je script zelf te maken heeft.

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


Verwijderd

Topicstarter
Vreemd is dat. Terwijl het toch een vrij standaard Debian installatie is.

  • Kees
  • Registratie: Juni 1999
  • Laatst online: 22:03

Kees

Serveradmin / BOFH / DoC
$TIMER in een string, dat kan fout gaan.
Welke bash versie gebruik je overigens?

Gebruik eens de officiele notatie voor variablen in bash?
code:
1
echo "${TIMER} * * * * ......." > crontab_${?}

[ Voor 17% gewijzigd door Kees op 14-01-2003 15:47 ]

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


Verwijderd

Topicstarter
Helaas heeft ook dat geen effect :?

Ik heb de volgende versie van bash:
code:
1
2
3
4
mars:/home/backup# /bin/bash --version
/bin/bash --version
GNU bash, version 2.05a.0(1)-release (i386-pc-linux-gnu)
Copyright 2001 Free Software Foundation, Inc.


Lijkt mij niet het probleem........ maar wat dan wel :?

/me raakt gestressed :)

  • Kees
  • Registratie: Juni 1999
  • Laatst online: 22:03

Kees

Serveradmin / BOFH / DoC
vaag dat het niet werkt?

mischien dat het aan de $TIMER ligt, probeer eens:
code:
1
TIMER=`cat /home/data/SETTINGS.INI | grep Backup | tail -c 3 | strings | tr -d "\n"`

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


Verwijderd

Topicstarter
Heb in die trent verschillende dingen geprobeerd. Echter zonder succes :?
Ik heb geprobeerd de string er neer te zetten, met en zonder quotes. Ook nog met een echo. Echter werkt het niet.

/me prutst maar een eind verder in de hoop het alsnog te fixen.......

Verwijderd

Zet boven in je script even:
code:
1
set -x

en probeer het nog eens, wat voor output krijg je dan?

Verwijderd

Topicstarter
Kijk, dat is nog eens een handige functie ;)
Dan krijg ik het volgende:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
++ date +%T
+ DATE=20:29:46
+ OUT=/home/backup
+ IN=/home/data/*
++ grep Backup
++ cat /home/data/SETTINGS.INI
++ tail -c 3
+ TIMER=4
+ echo ''

+ echo 'Start backup' 20:29:46
Start backup 20:29:46
++ date +%H.%M.%S
+ tar cfz /home/backup/backup.20.29.46.tar.gz /home/data/SETTINGS.INI /home/data/data.mdb /home/data/temp
tar: Removing leading `/' from member names
+ echo 'Einde backup' 20:29:46
Einde backup 20:29:46
+ echo ''

+ echo Timer: 4
Timer: 4
 * * * * /home/backup/backup.scr'


Bij die laatste regel moet die 4 ervoor komen :S

Want daar staat toch echt:
code:
1
echo "$TIMER * * * * /home/backup/backup.scr" > crontab.scr


Ik weet nog steeds niet waarom die 4 (variabele TIMER) niet geparsed word......

  • odysseus
  • Registratie: Augustus 2000
  • Laatst online: 20:19

odysseus

Debian GNU/Linux Sid

code:
1
echo -n $TIMER " * * * * /home/backup/backup.scr" > crontab.scr

Het is een wanhoopspoging, maar je weet nooit of het zo wel werkt :).

Leven is het meervoud van lef | In order to make an apple pie from scratch, you must first create the universe.


Verwijderd

Ik zou verwachten dat de laatste regel begint met:
+ echo
Kan het zijn dat er tussen de $TIMER en het eerste * een ander teken staat dan een spatie?

Ik zou zeggen:
vervang de laatste regel even tijdelijk door dit:
code:
1
echo "$TIMER * * * * /home/backup/backup.scr" | od -hc


en post het resultaat.

Verwijderd

Topicstarter
Ik heb even het laatste stukje hieronder geplaatst.
code:
1
2
3
4
5
6
7
8
9
10
Timer: 4
 * * * * /home/backup/backup.scr'
+ od -hc
0000000 0d34 2a20 2a20 2a20 2a20 2f20 6f68 656d
          4  \r       *       *       *       *       /   h   o   m   e
0000020 622f 6361 756b 2f70 6162 6b63 7075 732e
          /   b   a   c   k   u   p   /   b   a   c   k   u   p   .   s
0000040 7263 000a
          c   r  \n  \0
0000043

Lijkt er sterk op dat die /r roet in het eten gooit. Wat is de /r eigenlijk?

/me heeft weer wat hoop :P

Met dank aan de GoTters!!!! :)

Verwijderd

\r is linefeed
edit:
oeps had het idd fout is \r is "Carriage-Return"

[ Voor 68% gewijzigd door Verwijderd op 14-01-2003 23:06 ]


Verwijderd

Ok, dan is het duidelijk: \r (ofwel 0d ofwel ascii 13) is een carriage return.

Het probleem ontstaat doordat de SETTINGS.INI file DOS of windows newlines bevat (in windows is een newline de combinatie Carriage Return+Line Feed (0d 0a). Op Unix is een newline alleen een line feed. De TIMER variabele bevat dus een 4 gevolgd door een Carriage Return. Als je dit afdrukt zal wat daarna komt dus de 4 overschrijven (omdat de Carriage Return "de cursor" terug aan het begin van de regel zet).

De oplossing: maak van de SETTINGS.INI file een Unix formaat file of verander de regel waarin je de TIMER waarde bepaalt als volgt:

code:
1
TIMER=`cat /home/data/SETTINGS.INI | tr -d \\015 | grep Backup | tail -c 3`

[ Voor 6% gewijzigd door Verwijderd op 14-01-2003 22:59 ]


Verwijderd

Topicstarter
Ik heb gedaan wat jij gepost hebt, echter werkt dat niet.
Ik heb ook geprobeerd die 015 in 013 te veranderen aangezien dat daarboven aangegeven werd. Ook dat werkte niet.
Ik heb het idee dat die tr -d \\015 alle 0f blokken weghalen.

Echter staat er bij die octale dump 0d34 . Ik denk dat daar nog net iets mist.

Zou je me net dat laatste zetje in de rug willen geven :) . Ik ben al heel blij dat ik nu uiteindelijk begrijp waar het fout door gaat.
Helaas is het veranderen naar UNIX formaat niet te realiseren i.v.m. de VB scripting die dat genereerd.

Verwijderd

\\015 is de octale representatie van 13, het is dus 1*8+5 = 13. Check anders de manual page van od even. Misschien heeft je systeem ook wel een dos2unix of d2u die je kan gebruiken.

Edit: Duh.

[ Voor 5% gewijzigd door Verwijderd op 14-01-2003 23:54 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:15

.oisyn

Moderator Devschuur®

Demotivational Speaker

gezien de enorme invasie van NOSsers hier is het misschien niet handig om deze naar NOS te moven? :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Ik kom er nog niet helemaal uit :? (Ik denk dat het komt doordat ik nu even door de bomen het bos niet meer zie (heb zelfs problemen deze zin normaal te typen :) )).
Ik ben erachter gekomen dat tr -d \octale waarde moest zijn.
Alleen werkt het niet met de waarde 015.
Ook heb ik de od even veranderd in od -oc (Voor octale output).
Echter kon ik wel een 3-tallig voorkomend octaal nummer noemen. Maar dat werkt niet compleet. Het nummer komt dan niet meer voor maar de /r staat er nog wel in.......

Hoe nu verder te gaan?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:15

.oisyn

Moderator Devschuur®

Demotivational Speaker

mja laten we het maar doen :)
PW -> NOS

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Wilke
  • Registratie: December 2000
  • Laatst online: 23:07
Ik denk al, hoe komt er ineens een topic met zo'n titel in NOS terecht met 30 posts en nog steeds open! Daar kunnen een paar gasten heel snel typen ofzo :+

Maar goed, de enige inhoudelijke bijdrage die ik nu even kan leveren is dat ik hierboven zie dat je probeert 'tr -d \octale waarde' te gebruiken - het helpt als je de spatie tussen '-d' en '\octale waarde' weghaalt denk ik.

  • Kees
  • Registratie: Juni 1999
  • Laatst online: 22:03

Kees

Serveradmin / BOFH / DoC
probeer dan gewoon
code:
1
tr -d "\r"
?

of edit je settings.ini en haal de foute tekens eruit.

[ Voor 8% gewijzigd door Kees op 15-01-2003 00:59 ]

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


Verwijderd

Verwijderd schreef op 12 January 2003 @ 13:52:
TIMER=`cat /home/data/SETTINGS.INI | grep Backup | tail -c 3`
SETTINGS.INI is een DOS bestand, en dus is de newline niet een \n, maar een \r\n, en dus is de laatste cha van de regel voor Linux de \r. En in Linux is dat een goto-beginning-of-line teken, dus dan gaat ie weer naar positie 0. Oftewel, je zult SETTINGS.INI eerst (temporary?) moeten omzetten naar een Unix-formatted bestand, of anderzijds die \r eraf slopen.

edit:
Slaap ik ofzo? Er was nog een pagina 2. 8)7.

[ Voor 6% gewijzigd door Verwijderd op 15-01-2003 08:11 ]


Verwijderd

kan je dit niet doen?

grep Backup /home/data/SETTINGS.INI | awk '{ print substr($0,length($0)-2)}'

dan ben je gelijk ervan af of er wel of geen cariage-returns + newlines aan het einde van regels zitten. Awk haalt die eraf.

Als je het formaat van de regels weet kan je met de tools 'cut' , 'sed' of 'awk' nog wel wat simpelers bedenken dan dit.

[ Voor 9% gewijzigd door Verwijderd op 15-01-2003 08:53 ]


Verwijderd

Topicstarter
Het werkt inmiddels al naar behoren. Met grote dank aan alle posters.......

/me werd wel panisch van al die | - tekens :)

Verwijderd

offtopic:
:)
TIMER=`echo /home/data/SETTINGS.INI | xargs cat | grep Backup | tr -d'\r' | tail -c 3`
de langst denkbare pipeline is ook leuk :)
Pagina: 1