1

Onderwerp: Geen "function" support in Bash?

Ik ben wat aan het scripten met bash. Na het definiëren van een functie krijg ik bij het uitvoeren de melding: "~/test: 1 function: not found "
Dit zou betekenen dat er geen support voor functie zou zijn.
bash, zowel als bash-completion zijn geinstalleerd, mis ik hier iets of is er iets mis met bash?

Laptop: (2x) Packard Bell Easynote met Linux-Mint 9 (x64)
Home-server: Debian Lenny

Re: Geen "function" support in Bash?

De bash function syntax staat hier beschreven: http://tille.garrels.be/training/bash/c … t_11_01_02

Maar het zou helpen als je het stukje niet-werkende code zou posten in elk geval.

3

Re: Geen "function" support in Bash?

Dat stuk van je link heb ik gelezen. Ter verduidelijking onderstaand een stuk code:

#Geef een waarschuwing dat de backups beginnen
function vraag
{
/usr/bin/zenity --display :0 --question --text="Er moet een backup gemaakt worden van "$bron". \rGaan we dat nu doen?"
}

    # Niet nu:
    if [ "$?" = 1 ]; then
    /usr/bin/zenity --error --display :0 --text="Update geannuleerd."
    sleep 600
    vraag;
    else
            #check of er een lockfile is
            etcetera....
Laptop: (2x) Packard Bell Easynote met Linux-Mint 9 (x64)
Home-server: Debian Lenny

Re: Geen "function" support in Bash?

Ben je het script begonnen met "#!/bin/bash"? Mischien dat een andere shell interpreter op jouw systeem de zaak probeert te draaien.

Dit minimale voorbeeld werkt bij mij:

#!/bin/sh

function hello
{
    echo "hello, world!"
}

hello

Zodoende dat we het probleem kunnen vangen in een minimaal script.

5

Re: Geen "function" support in Bash?

ben inderdaad begonnen met "#!/bin/bash" en met "#!/bin/sh" wordt het niet anders.
Ik heb jouw testvoorbeeldje ook even gemaakt, maar geeft dezelfde foutmelding:

philip@Trinity ~/testmap $ sh test.sh
test.sh: 2: function: not found
philip@Trinity ~/testmap $

ik kan alleen maar concluderen dat bash de functie "function"niet herkent.

Laptop: (2x) Packard Bell Easynote met Linux-Mint 9 (x64)
Home-server: Debian Lenny

Re: Geen "function" support in Bash?

Voor de zekerheid kan je "bash test.sh" proberen in plaats van "sh test.sh",

Ik had in mijn vorige post #!/bin/sh gebruikt, maar je kan beter #!/bin/bash doen, mocht het zo zijn dat je een andere shell op je systeem zou hebben (Want /bin/sh kan (en is vaak) een symbolic link (zijn))

Als je zeker bent dat je bash gebruikt, dan is dit is wel vreemd,

Wat voor versie van bash heb je?

Daar kom je achter met "bash --version".

Hier draait 3.2.33

7

Re: Geen "function" support in Bash?

flipje schreef:

ben inderdaad begonnen met "#!/bin/bash" en met "#!/bin/sh" wordt het niet anders.
Ik heb jouw testvoorbeeldje ook even gemaakt, maar geeft dezelfde foutmelding:

philip@Trinity ~/testmap $ sh test.sh
test.sh: 2: function: not found
philip@Trinity ~/testmap $

ik kan alleen maar concluderen dat bash de functie "function"niet herkent.

Je gebruikt Mint ?

Dan verwijst /bin/sh naar Dash

Niet naar Bash.

8

Re: Geen "function" support in Bash?

philip@Trinity ~ $ bash --version
GNU bash, versie 4.1.5(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
De licentie is GPLv3+: GNU GPL versie 3 of later.
Zie http://gnu.org/licenses/gpl.html voor de volledige tekst.

Dit is vrije software; u mag het vrijelijk wijzigen en verder verspreiden.
Er is GEEN GARANTIE, voor zover de wet dit toestaat.
philip@Trinity ~ $

Even ter verduidelijking: ik noem het script hierboven van chromisX even `test.sh`; mijn script noem ik `rs-doc.sh`
Het volgende doet zich nu voor: Als ik het test-scriptje van chromisX uitvoer met "bash test.sh" doet die het goed.
Verander ik in mijn script de kopregel door  "#!/bin/sh" en run het met "bash -x rs-doc.sh" dan slaat ie het stuk vanaf function gewoon over alsof het er niet staat.

ik post hieronder even het volledige script; het werkt prima, maar ik wilde de functie erin zetten om een loop creëren indien de  vraag om de backup uit te voeren met nee word beantwoord, en daarna na een bepaalde tijd de vraag herhaalt.

#!/bin/bash
#
# Script voor het maken van een backup met rsync
# de output van rsync wordt doorgestuurd naar zenity
# die er een mooie melding van laat zien. (via rsync.awk)

bron='/home/philip/rsync-testmap/'
doel='server1:/srv/pub/testmap/'
path='/home/philip/Documenten/systeem/routines'
lock_file='/var/lock/rs-thb.pid'
prog_name=`basename $0`


# Ga naar het pad waar de routines staan
cd $path

# Geef een notificatie in het panel
/usr/bin/zenity --display :0 --notification --text="Er moeten backups gemaakt worden!"

#Geef een waarschuwing dat de backups beginnen
function vraag {
`/usr/bin/zenity --display :0 --question --text="Er moet een backup gemaakt worden van "$bron". \rGaan we dat nu doen?"`
}

    # Indien annuleren:
    if [ "$?" = 1 ]; then
    /usr/bin/zenity --error --display :0 --text="Update geannuleerd."
    sleep 600
    vraag ;
    else
            #check of er een lockfile is
            if [ -f "${lock_file}" ]; then
            # check of de pid van de lockfile nog bestaat
                lock_pid=`cat ${lock_file}`
                lock_pgm=`ps -p ${lock_pid} -o comm=`
                                      
                # check of de pid nog geldig is
                if [ "${lock_pgm}" = "${prog_name}" ]; then
                       /usr/bin/zenity --warning --display :0 --title "WAARSCHUWING!" --text="Vorige backup is nog bezig, of niet goed afgesloten.. !"
                    exit;
                else
                       # verwijderen van oude lock
                    /usr/bin/zenity --info --display :0 --title "Lock-file" --text="Verwijderen van oude lock-file van vorig of oud proces"
                    
                    rm ${lock_file}
                fi
            fi
        # Maken van de lock-file
        echo $$ > ${lock_file}
        
        # check of alles goed gegaan is
        lock_pid=`cat ${lock_file}`
        if [ $$ -ne ${lock_pid} ]; then
            # Er kan geen nieuwe lock-file gemaakt worden
            /usr/bin/zenity --warning --display :0 --title "WAARSCHUWING!" --text= "Kan geen lock-file maken, er is een conflict met pid ${LOCK_PID}"
            exit 1;
        fi

        rsync -avz -e ssh --progress --delete-after $bron  $doel |
        awk -f test.awk |
          /usr/bin/zenity --progress --display :0  --width 400 --title  "Backing up $bron" \
             --text="Backing up...." ;
    
        # Er wordt op annuleren gedrukt
            if [ "$?" = 1 ] ; then
            zenity --error --text="Update afgebroken!";echo $?
            exit ;
                 fi
        # Verwijderen lock-file
        rm ${lock_file}
    fi
Laptop: (2x) Packard Bell Easynote met Linux-Mint 9 (x64)
Home-server: Debian Lenny

9

Re: Geen "function" support in Bash?

ik geloof dat parameter haakjes in de functie definitie mandatory zijn

function blaat()
{
  echo "blaat"
}

blaat
Pascal's Blobfree Homepage
Een dag geen NedLinux is een dag niet geleefd

10

Re: Geen "function" support in Bash?

Van de man page:

[ function ] name () compound-command [redirection]
              This defines a function named name.  The reserved word  function
              is  optional.   If  the  function reserved word is supplied, the
              parentheses are optional.
  The body of the function is the  com-
              pound  command  compound-command  (see Compound Commands above).
              That command is usually a list of commands between { and },  but
              ....

M.a.w. je moet de parentheses gebruiken als je de 'function' keyword niet gebruikt.

Re: Geen "function" support in Bash?

Ooooooooh! Dààr zijn die (ronde) haakjes dus voor. Als je voor je function het woordje "function" niet wilt schrijven. Dus zo bijvoorbeeld kan het zonder haakjes:

function blaat
{
  echo "blaat"
}

blaat

Weer iets geleerd! smile

Als je voor een verdieping niet de diepte in moet, maar de hoogte, waarom heet het dan ....

12

Re: Geen "function" support in Bash?

Na wat aanpassingen ben ik er uit. Onderstaand de juiste code

#!/bin/bash
#
# Script voor het maken van een backup met rsync
# de output van rsync wordt doorgestuurd naar zenity
# die er een mooie melding van laat zien. (via rsync.awk)
############ DECLARATIES ##################################
bron='/home/philip/rsync-testmap/'
doel='zion:/srv/pub/testmap/'
path='/home/philip/Documenten/systeem/routines'
lock_file='/var/lock/rs-thb.pid'
prog_name=`basename $0`
function question {
/usr/bin/zenity --display :0 --question --text="Er moeten backups gemaakt worden!"
# Indien annuleren:
    if [ "$?" = 1 ]; then
    /usr/bin/zenity --error --display :0 --text="Update geannuleerd."
    sleep 10
    question
    fi
}
#########################################################
# Ga naar het pad waar de routines staan
cd $path
# Geef een waarschuwing in het paneel
/usr/bin/zenity --display :0 --notification --text="Er moeten backups gemaakt worden!"
# Vraag of de backups nu moeten worden uitgevoerd
question
#check of er een lockfile is
if [ -f "${lock_file}" ]; then
    # check of de pid van de lockfile nog bestaat
         lock_pid=`cat ${lock_file}`
           lock_pgm=`ps -p ${lock_pid} -o comm=`
           # check of de pid nog geldig is
    if [ "${lock_pgm}" = "${prog_name}" ]; then
    /usr/bin/zenity --warning --display :0 --title "WAARSCHUWING!" --text="Vorige backup is nog bezig, of niet goed afgesloten.. !"
           exit;
    else
    # verwijderen van oude lock
         /usr/bin/zenity --info --display :0 --title "Lock-file" --text="Verwijderen van oude lock-file van vorig of oud proces"
           rm ${lock_file}
    fi
fi
# Maken van de lock-file
echo $$ > ${lock_file}
    # check of alles goed gegaan is
    lock_pid=`cat ${lock_file}`
    if [ $$ -ne ${lock_pid} ]; then
    # Er kan geen nieuwe lock-file gemaakt worden
         /usr/bin/zenity --warning --display :0 --title "WAARSCHUWING!" --text= "Kan geen lock-file maken, er is een conflict met pid ${LOCK_PID}"
           exit 1;
    fi
#maak de eigenlijke back-up
rsync -avz -e ssh --progress --delete-after $bron  $doel |
awk -f test.awk |
/usr/bin/zenity --progress --display :0  --width 400 --title  "Backing up $bron" \
--text="Backing up...." ;
    # Er wordt op annuleren gedrukt
    if [ "$?" = 1 ] ; then
    zenity --error --text="Update afgebroken!";echo $?
    exit ;
         fi
# Verwijderen lock-file
rm ${lock_file}

Opgemerkt dat het dus met het commando "bash rs-doc.sh" werkt en niet met "sh rs-doc.sh ".
Het laatste geeft dus de foutmelding:  "function: not found"

Misschien dat iemand nog een antwoord heeft waarom het bij de één wel werkt en bij de ander niet.
Voor de rest bedankt voor de reacties,

groet
Philip

Edit:

Als ik de regel:
function question {
blaat
}

wijzig in:
question () {
blaat
}


werkt het wel met "sh rs-doc.sh"

Het verschil zit dus in het woord "function" wat bij bash wel bekend is en bij sh niet.

Laptop: (2x) Packard Bell Easynote met Linux-Mint 9 (x64)
Home-server: Debian Lenny

13

Re: Geen "function" support in Bash?

flipje schreef:

Opgemerkt dat het dus met het commando "bash rs-doc.sh" werkt en niet met "sh rs-doc.sh ".
Het laatste geeft dus de foutmelding:  "function: not found"

Misschien dat iemand nog een antwoord heeft waarom het bij de één wel werkt en bij de ander niet.

Dat had ik al beantwoord.

Je gebruikt Mint neem ik aan.

Onder Ubuntu en afgeleiden verwijst /bin/sh naar Dash niet naar Bash.

Kun je controleren met

ls -ld /bin/sh

14

Re: Geen "function" support in Bash?

Ja, ik gebruik Mint. 
Je had inderdaad de vraag al beantwoord. Wat ik eigenlijk bedoelde wat dan de verschillen zijn tussen Bash en Dash.
Ik heb intussen wat op het net gespeurd, maar wordt daar niet veel wijzer van, evenals de man-page.

Laptop: (2x) Packard Bell Easynote met Linux-Mint 9 (x64)
Home-server: Debian Lenny

15

Re: Geen "function" support in Bash?

Dash houdt zich beter aan standaarden als Bash en het zou sneller moeten zijn, dan werken de scripts ook op andere Unixen, waar bash niet de standaard is.

Zie :

http://en.wikipedia.org/wiki/Debian_Almquist_shell

Ik heb in het verleden ook ruzie gehad met Dash, ik draaide een bash script om een nVidia driver te installeren, tijdelijk de link aangepast naar bash.