Gestione delle trap e sottotitoli impliciti negli script di shell


12

Supponiamo che tu abbia uno script di shell che esegue una sorta di codice di pulizia tramite una EXITtrap, in questo modo:

#!/bin/bash

mytrap () {
  echo "It's a trap!" >&2
}

trap mytrap exit

echo I am at the end of the script.

Questo, come previsto, verrà stampato all'uscita It's a trap!dello script:

$ sh myscript
I am at the end of the script.
It's a trap!

Modifichi lo script per aggiungere una funzione che genera un output che alla fine viene reindirizzato a un altro comando, come questo:

#!/bin/bash

mytrap () {
  echo "It's a trap!" >&2
}

myfunc () {
  echo "I've got a bad feeling about this..."
}

trap mytrap exit

myfunc | cat > /dev/null

echo I am at the end of the script.

A causa della pipe, il codice in myfuncviene eseguito in una subshell ... e le subshells non sembrano ereditare il trapcomportamento del genitore, il che significa che se si eseguono azioni qui che devono essere ripulite dal codice trap che ha vinto " non succede.

Quindi prova questo:

myfunc () {
  trap mytrap EXIT
  echo "I've got a bad feeling about this..."
}

E non riesce ancora a innescarsi mytrapquando esce la subshell. Si scopre che è necessario un esplicito exit, come questo:

myfunc () {
  trap mytrap EXIT
  echo "I've got a bad feeling about this..."
  exit
}

Con il codice sopra, mytrapsi attiverà in modo appropriato all'uscita dalla sottoshell:

$ sh myscript 
It's a trap!
I am at the end of the script.
It's a trap!

È un comportamento previsto? Sono stato sorpreso da diverse cose qui:

  • trap le impostazioni non sono state ereditate dai subshells
  • l'uscita implicita da una subshell non sembra innescare una EXIT trap

Risposte:


8

Il trapbuilt-in bash consente la parola chiave RETURN. Quindi cambia:

trap mytrap EXIT

per:

trap mytrap RETURN

Vedi la discussione su trapin shell-builtins

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.