Bash a trap

iko

  • ***
  • 149
Bash a trap
« kdy: 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:
(
    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 {}:
{
    ....
} 2>&1 >>log

tak trap uz nefunguje. Preco?


Re:bash a trap
« Odpověď #1 kdy: 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

iko

  • ***
  • 149
Re:bash a trap
« Odpověď #2 kdy: 20. 11. 2023, 09:38:15 »
Citace od: Václav Ovsik kdy 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

To by slo :)
V bashi robim uz roky ale o tomto som nevedel... vdaka :) :)

Jose D

  • *****
  • 925
Re:bash a trap
« Odpověď #3 kdy: 20. 11. 2023, 12:17:54 »
Citace od: Václav Ovsik kdy 20. 11. 2023, 09:11:21
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.

Wasper

  • ****
  • 263
Re:Bash a trap
« Odpověď #4 kdy: 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.


Re:Bash a trap
« Odpověď #5 kdy: 20. 11. 2023, 15:51:48 »
Citace od: iko kdy 20. 11. 2023, 08:19:01
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ť.


~$ 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.