trap(1p): Skillnad mellan sidversioner
Admin (diskussion | bidrag) (Skapade sidan med '== NAMN == '''trap''' — fånga (”trappa”) signaler == SYNOPSIS == <pre> trap n [villkor …] trap [åtgärd villkor …] </pre> == BESKRIVNING == Om den första operandens värde är ett osignerat decimalt heltal, ska skalet tolka alla operander som villkor och återställa varje sådant villkor till standardåtgärden. Annars, om det finns operander, behandlas den första som en åtgärd och resten som villkor. Om '''åtgärd''' är '''-''' återställs varje...') |
(Ingen skillnad)
|
Versionen från 29 september 2025 kl. 12.14
NAMN
trap — fånga (”trappa”) signaler
SYNOPSIS
trap n [villkor …] trap [åtgärd villkor …]
BESKRIVNING
Om den första operandens värde är ett osignerat decimalt heltal, ska skalet tolka alla operander som villkor och återställa varje sådant villkor till standardåtgärden. Annars, om det finns operander, behandlas den första som en åtgärd och resten som villkor.
Om åtgärd är - återställs varje villkor till standardvärde. Om åtgärd är tom sträng ("") ska skalet ignorera varje angivet villkor om det inträffar. I annat fall läses och körs åtgärd av skalet när något av de motsvarande villkoren inträffar. Den åtgärd som satts via trap ersätter tidigare åtgärd (antingen standard eller en som satts uttryckligen). Värdet på $? efter att trap-åtgärden slutförts är detsamma som före anropet av trap.
Ett villkor kan vara EXIT, 0 (ekvivalent med EXIT), eller ett signalnamn utan prefixet SIG enligt tabellerna i rubriken <signal.h> (se signal.h(0p)), t.ex. HUP, INT, QUIT, TERM. Implementationer kan som utökning tillåta namn med prefixet SIG och/eller ignorera skiftläge. Att sätta trap för SIGKILL eller SIGSTOP ger odefinierat resultat.
Miljön där skalet kör en trap på EXIT ska vara identisk med miljön omedelbart efter det sista kommandot som kördes innan trap på EXIT togs.
Varje gång trap anropas ska argumentet åtgärd behandlas som om:
eval åtgärd
Signaler som ignorerades när ett icke-interaktivt skal startades kan inte fångas eller återställas (det behöver dock inte rapporteras som fel att försöka). Ett interaktivt skal kan återställa eller fånga signaler som ignorerades vid start. Traps ligger kvar för ett givet skal tills de ändras med ett nytt trap-kommando.
När en underskal (subshell) startas sätts traps som inte ignoreras till sina standardåtgärder, utom i fallet med en kommandosubstitution som endast innehåller ett enda trap-kommando; då behöver traps inte ändras. Implementationer kan identifiera detta fall med enbart lexikal analys; t.ex. kan `trap` och $( trap -- ) lämna traps oförändrade, medan mer indirekta fall (tilldela var=trap och sedan $($var)) kan ändra dem. Detta hindrar inte att trap används inne i underskalet för att sätta nya traps.
trap utan operander ska skriva till standardutmatning en lista över kommandon associerade med varje villkor. Om kommandot körs i ett underskal, ingen sådan ”enda-trap”-optimering tillämpas och inga trap-kommandon med operander har körts sedan underskalet startade, ska listan avspegla läget omedelbart före inträdet i underskalet; annars det aktuella läget. Formatet ska vara:
trap -- %s %s ...
där första %s är <åtgärd> och följande är <villkor> … Skalets utdata ska citeras korrekt så att den kan läsas in igen för att återskapa samma traps. Exempel:
save_traps=$(trap) … eval "$save_traps"
XSI-konforma system kan även tillåta numeriska signalnummer för följande signalnamn:
- 1
- SIGHUP
- 2
- SIGINT
- 3
- SIGQUIT
- 6
- SIGABRT
- 9
- SIGKILL
- 14
- SIGALRM
- 15
- SIGTERM
Det specialinbyggda kommandot trap ska följa POSIX Basdefinitioner, avsnitt 12.2.
FLAGGOR
Inga.
OPERANDER
Se BESKRIVNING.
STDIN
Används inte.
INDATAFILER
Inga.
MILJÖVARIABLER
Inga.
ASYNKRONA HÄNDELSER
Standard.
STDOUT
Se BESKRIVNING (utskrift av aktuella traps när trap körs utan operander).
STDERR
Endast diagnostiska meddelanden.
UTDATAFILER
Inga.
UTÖKAD BESKRIVNING
Ingen.
RETURKOD
Om trap-namn eller nummer är ogiltigt returneras en icke-noll status; annars noll. För både interaktiva och icke-interaktiva skal ska ogiltiga signalnamn eller nummer inte betraktas som syntaxfel och orsakar inte att skalet avbryts.
FELKONSEKVENSER
Standard. Följande avsnitt är informativa.
ANVÄNDNINGSTIPS
Inga.
EXEMPEL
Skriv ut en lista över alla traps och åtgärder:
trap
Sätt en trap så att programmet logout i katalogen som pekas ut av miljövariabeln HOME körs när skalet terminerar:
trap '"$HOME"/logout' EXIT
eller:
trap '"$HOME"/logout' 0
Ta bort traps för INT, QUIT, TERM och EXIT:
trap - INT QUIT TERM EXIT
RATIONALE
Implementationer kan tillåta gemener i signalnamn som utökning. Vissa tillåter även namn med prefixet SIG (historiskt ovanligt). trap och kill i denna standard är konsekventa i att utelämna prefixet. Vissa kill-implementationer tillåter inte prefixet, och kill -l listar signaler utan prefix.
Att försöka fånga SIGKILL eller SIGSTOP accepteras syntaktiskt i vissa historiska implementationer men har ingen effekt. Portabla POSIX-program får inte försöka fånga dessa signaler.
Utdataformatet är inte historisk praxis; det utformades för att vara portabelt och återinläsbart i skalet (så att traps kan sparas/återställas).
KornShell har en ERR-trap som triggas när set -e annars skulle orsaka exit. Detta är tillåtet som utökning men inte krav.
Texten om miljön för EXIT-trap ogiltigförklarar beteendet i vissa historiska interaktiva skal som t.ex. stängde standardin före körning av trap på 0. Exempel som i vissa historiska skal alltid skrev "--":
trap 'read foo; echo "-$foo-"' 0
Att köra innehållet i variabeln cmd vid exit:
trap 'eval " $cmd"' 0
Att använda:
trap '$cmd' 0
fungerar inte korrekt om cmd innehåller specialtecken (citationstecken, omdirigeringar etc.). Detta:
trap " $cmd" 0
fungerar också (inledande blanktecken skyddar mot fall där cmd är ett heltal eller börjar med -), men expanderar cmd när trap körs, inte vid exit.
FRAMTIDA RIKTNINGAR
Inga.
SE ÄVEN
Section 2.14, Special Built-In Utilities; POSIX Basdefinitioner, avsnitt 12.2; signal.h(0p), sh(1p)
COPYRIGHT
Delar av texten är återgiven från IEEE Std 1003.1-2017 (POSIX), The Open Group Base Specifications Issue 7, 2018 Edition. Vid avvikelse gäller originalstandarden. Se [1](http://www.opengroup.org/unix/online.html) för originalet. Eventuella typografiska/formatteringsfel kan rapporteras enligt [2](https://www.kernel.org/doc/man-pages/reporting_bugs.html).