Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: iko 20. 11. 2023, 08:19:01

Název: Bash a trap
Přispěvatel: iko 20. 11. 2023, 08:19:01
Zdravim

V skriptoch obcas pouzivam na ochranu proti viacnasobnemu spusteniu lock subory a trap a vsetky vypisy davam do log suboru:
Kód: [Vybrat]
(
    if { set -C; 2>/dev/null >$LOCKFILE; }; then
        trap "rm -f $LOCKFILE" EXIT
    else
        echo `date`: "Lock file exists… exiting"
        exit 1
    fi
    ...
    ....
) 2>&1 >>log

Pokial to cele zabalim do subshelu (normalnymi zatvorkami), vsetko funguje. Ak to ale miesto subshellu zabalim do {}:
Kód: [Vybrat]
{
    ....
} 2>&1 >>log
tak trap uz nefunguje. Preco?
Název: Re:bash a trap
Přispěvatel: Václav Ovsik 20. 11. 2023, 09:11:21
Co místo závorek použít na přesměrování exec ?
https://unix.stackexchange.com/questions/184125/exec-redirects-in-bash
Název: Re:bash a trap
Přispěvatel: iko 20. 11. 2023, 09:38:15
Co místo závorek použít na přesměrování exec ?
https://unix.stackexchange.com/questions/184125/exec-redirects-in-bash

To by slo :)
V bashi robim uz roky ale o tomto som nevedel... vdaka :) :)
Název: Re:bash a trap
Přispěvatel: Jose D 20. 11. 2023, 12:17:54
Co místo závorek použít na přesměrování exec ?

exec &>>"$logfile"

nejdřív jsem na to koukal dost nedůvěřivě, ale po pročtení man-u to vlastně dává smysl.
Zajímavé, díky.
Název: Re:Bash a trap
Přispěvatel: Wasper 20. 11. 2023, 13:40:23
Možná of-topic, ale na ty zámky - koukněte na man 1 flock , to řeší takové ty chyby jako program skončil ale něco ten .lck nesmazalo apod.
Název: Re:Bash a trap
Přispěvatel: vlado99 20. 11. 2023, 15:51:48
Pokial to cele zabalim do subshelu (normalnymi zatvorkami), vsetko funguje. Ak to ale miesto subshellu zabalim do {}:

Odpovedal si si sám. () - subshell, {} - blok, tj. žiaden shell sa neukončuje, nenastane EXIT udalosť.

Kód: [Vybrat]
~$ cat s1
#!/bin/bash
echo Start
(
        echo Subshell start
        trap "echo Exit trap - subshell" EXIT
        echo Subshell end
)
echo End

~$ bash s1
Start
Subshell start
Subshell end
Exit trap - subshell
End

~$ cat s2
#!/bin/bash
echo Start
{
        echo Block start
        trap "echo Exit trap" EXIT
        echo Block end
}
echo End

~$ bash s2
Start
Block start
Block end
End
Exit trap

~$


Ak by to nebol voľný blok ale funkcia, mohol by si použiť RETURN trap.