trap(1p)

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök

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 trapEXIT ska vara identisk med miljön omedelbart efter det sista kommandot som kördes innan trapEXIT 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).

Sidslut

Orginalhemsidan på Engelska https://man7.org/linux/man-pages/man1/trap.1p.html Det här är en maskinöversättning av Linux man sidor till svenska. Om du hittar fel är vi tacksamma om du rapporterar dem via formuläret som finns på https://www.linux.se/kontaka-linux-se/

Tack till PC Service som har sponsrat Linux.se med webbhotell.