Bash a trap

iko

  • ***
  • 148
    • Zobrazit profil
    • E-mail
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:
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?
« Poslední změna: 20. 11. 2023, 09:17:09 od Petr Krčmář »


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

  • ***
  • 148
    • Zobrazit profil
    • E-mail
Re:bash a trap
« Odpověď #2 kdy: 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 :) :)

Jose D

  • *****
  • 893
    • Zobrazit profil
Re:bash a trap
« Odpověď #3 kdy: 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.

Wasper

  • ***
  • 124
    • Zobrazit profil
    • E-mail
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 »
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.