[Shell Script]: Hoe variabelen exporteren uit pipe?

Pagina: 1
Acties:

  • arnova
  • Registratie: Augustus 2001
  • Laatst online: 02-02 18:07

arnova

weet veel, maar niet alles

Topicstarter
Ik heb het volgende stukje shell script:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/sh

MYVAR=no

df |while read LINE; do
  ...
  echo "$LINE"
  if [ "$LINE" = "..." ]; then
    export MYVAR=yes
  fi
done

echo "$MYVAR"


Nu krijg ik het dus met geen mogelijkheid voor elkaar om de waarde van $MYVAR die gezet wordt naar in dit geval "yes" te exporteren naar het hoofd script. Hoe krijg ik dat voor elkaar?

Ctrl4Dkn: ESP32 (Floor) Heat Controller With Daikin (Heatpump) Support - https://github.com/arnova/ctrl4dkn


  • blaataaps
  • Registratie: Juli 2001
  • Niet online
Niet, processen kunnen niet de environment van parents veranderen (gelukkig). Wat wel kan, is de aanroep, in plaats van gewoon aanroepen in een subshell, het script sourcen, als ik je constructie met "hoofdscript" goed begrijp, hoewel ik dan de pipe in de titel niet kan plaatsen.

[ Voor 23% gewijzigd door blaataaps op 31-01-2007 13:40 ]


  • arnova
  • Registratie: Augustus 2001
  • Laatst online: 02-02 18:07

arnova

weet veel, maar niet alles

Topicstarter
blaataaps schreef op woensdag 31 januari 2007 @ 13:37:
Niet, processen kunnen niet de environment van parents veranderen (gelukkig). Wat wel kan, is de aanroep, in plaats van gewoon aanroepen in een subshell, het script sourcen, als ik je constructie met "hoofdscript" goed begrijp, hoewel ik dan de pipe in de titel niet kan plaatsen.
Is het misschien mogelijk met zoiets als?:
code:
1
2
3
4
...
while ...
done < &5
...


En zo ja hoe krijg ik dan de output (stdout) van 'df' in file descriptor &5?

Ctrl4Dkn: ESP32 (Floor) Heat Controller With Daikin (Heatpump) Support - https://github.com/arnova/ctrl4dkn


  • arnova
  • Registratie: Augustus 2001
  • Laatst online: 02-02 18:07

arnova

weet veel, maar niet alles

Topicstarter
blaataaps schreef op woensdag 31 januari 2007 @ 13:37:
Niet, processen kunnen niet de environment van parents veranderen (gelukkig). Wat wel kan, is de aanroep, in plaats van gewoon aanroepen in een subshell, het script sourcen, als ik je constructie met "hoofdscript" goed begrijp, hoewel ik dan de pipe in de titel niet kan plaatsen.
Je hebt mij verkeerd begrepen. Ik bedoel niet dat die variable vanuit mijn script naar mijn systeem geexporteerd zou moeten worden. Het gaat omdat while;done loopje wat via een pipe (|) zijn stdin gevoerd krijgt. Als ik in dat loopje MYVAR zet/veranderen dan gaat die waarde verloren zodra ik die while-loop weer uit ben....

Ctrl4Dkn: ESP32 (Floor) Heat Controller With Daikin (Heatpump) Support - https://github.com/arnova/ctrl4dkn


Verwijderd

code:
1
2
3
4
5
6
7
FIFO=/tmp/.jouwproces_unique_identifier
mkfifo $FIFO
df > $FIFO &
while ... < $FIFO
  ...
  done
...


Zoiets?

  • robkamp
  • Registratie: Maart 2006
  • Laatst online: 29-01 15:19
[b][message=27416272,noline]master_artech schreef op woensdag 31 januari 2007 @ 13:23Nu krijg ik het dus met geen mogelijkheid voor elkaar om de waarde van $MYVAR die gezet wordt naar in dit geval "yes" te exporteren naar het hoofd script. Hoe krijg ik dat voor elkaar?
Volgens mij moet je eerste MYVAR=no ook een export zijn.

code:
1
2
3
#!/bin/sh

export MYVAR=no # makes the variable global to the script


Suc6

  • frim
  • Registratie: Augustus 2001
  • Niet online
Waarom gebruik je zo'n lastige constructie? Kun je niet gewoon een for-loop gebruiken?
code:
1
2
3
4
5
6
a=`df`
IFS=$'\n'
for line in $a; do
    echo $line
    # Iets anders
done

Verwijderd

Met export zorg je ervoor dat een variabele mee gaat als je een subshell opent. In dit script werk je niet met subshells. Je hoeft de variabele dus niet te exporteren.

De variabele MYVAR word in dit scriptje wel meegenomen naar de laatste echo. Als je het copy/paste en uitvoert, zie je het resultaat van df op je scherm, en daarna een "no".

Vertel eens wat je scriptje moet doen. Misschien dat het dan wat makkelijker word om te helpen.

  • arnova
  • Registratie: Augustus 2001
  • Laatst online: 02-02 18:07

arnova

weet veel, maar niet alles

Topicstarter
Dit is wat het script nu is:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
IFS=$'\n'
for LINE in `df -h -P -l`; do
  echo -n "$LINE"
  if [ ! -z "$(echo "$LINE" |grep -v "Use%")" ]; then
    free_perc=`echo "$LINE" |awk '{ print $5 }' |sed s,'%',,`
    if [ $free_perc -gt 95 ]; then
      echo ' (At or near max. capacity!)'
      DF_WARNING=1
    fi
  fi
  echo ""
done
if [ "$DF_WARNING" = "1" ]; then
  echo ""
  echo "** WARNING: One or more filesystems are at or near maximum capacity! **"
fi


Het is dus een check om te kijken of je filesystemen niet bijna out-of-disk-space zijn. Het vervelende is alleen dat die "for LINE in `df -h -P -l`; do" icm IFS=$'\n' (die ik zelf ook al had), niet goed werkt wanneer je een POSIX compliant shell zoals dash (standaard in Debian gebruikt). Bovendien vind ik het gebruik van een pipe zelf fraaier. Vandaar dus dat ik had bedacht om er van te maken "df -h |while read LINE" etc... Maar dan krijg je dus die DF_WARNING-waarde er niet "uit"....

[ Voor 3% gewijzigd door arnova op 03-02-2007 16:20 ]

Ctrl4Dkn: ESP32 (Floor) Heat Controller With Daikin (Heatpump) Support - https://github.com/arnova/ctrl4dkn


  • arnova
  • Registratie: Augustus 2001
  • Laatst online: 02-02 18:07

arnova

weet veel, maar niet alles

Topicstarter
Verwijderd schreef op donderdag 01 februari 2007 @ 14:03:
code:
1
2
3
4
5
6
7
FIFO=/tmp/.jouwproces_unique_identifier
mkfifo $FIFO
df > $FIFO &
while ... < $FIFO
  ...
  done
...


Zoiets?
Yep, that's it :-D (Sorry, eerder overheen gelezen)

[ Voor 5% gewijzigd door arnova op 08-02-2007 22:33 ]

Ctrl4Dkn: ESP32 (Floor) Heat Controller With Daikin (Heatpump) Support - https://github.com/arnova/ctrl4dkn

Pagina: 1