2012-02-29 21 views
7

Ho cercato dappertutto e sono venuto a credere che non v'è alcun modo per farlo che oltre ad avere le variabili globali, ma credo che i guru in stackoverflow.com possono essere in grado di aiutarmi:Funzione trap passando gli argomenti?

C'è in qualche modo in bash per intrappolare una funzione passando argomenti ad essa?
Ad esempio, trap <function_name> <arg_1> <arg_2> SIGINT?

risposta

13

trap consente di specificare un comando arbitrario (o una sequenza di comandi), ma è necessario passare tale comando come un singolo argomento. Ad esempio, questo:

trap 'foo bar baz | bip && fred barney ; wilma' SIGINT 

verrà eseguito questo:

foo bar baz | bip && fred barney ; wilma 

ogniqualvolta il guscio riceve SIGINT. Nel tuo caso, suona come si desidera:

trap '<function> <arg_1> <arg_2>' SIGINT 
+1

Yeap! Grazie:] – Kounavi

+0

In realtà non funzionava da quando si chiama trap "myfunction $ arg_1 $ arg_2" SIGINT SIGTERM significava che quando Ctrl-C veniva premuto i vecchi valori di $ arg_1 $ arg_2 dove erano conservati e non quelli di aggiornamento. Suppongo che userò una funzione wrapper o renderò globali gli argomenti poiché non posso farlo funzionare nel modo in cui intendevo:/P.S .: È importante che io abbia usato double_quotes e non singolo come nel tuo esempio? – Kounavi

+1

@Kounavi: Come hai indovinato, devi usare virgolette singole, non virgolette. – ruakh

2

Forse ti sto malinteso, ma ... questo è legale:

trap "cp /etc/passwd $HOME/p" SIGINT 
trap 'cp /etc/passwd /tmp/p; echo wooo hoo' SIGINT 
+0

Solo le virgolette singole hanno funzionato con variabili di tipo $ arg1, $ arg2 ecc. Ma, sì, è quello che mi serviva! ;) – Kounavi

+1

Sono contento che Michal l'abbia spiegato in modo così approfondito e che tu abbia capito. :) – rsaw

1

Io non sono sicuro ho capito bene cosa vuoi dire , ma se si desidera che un gestore di segnale chiami una funzione e passi i parametri, trap "function arg1 arg2" SIGNAL dovrebbe funzionare. Ad esempio, trap "ls -lh /" INT causerà Ctrl + C nella shell in modo che venga chiamato ls -lh / (programma con 2 arg).

+0

In realtà non stavo usando le virgolette e non funzionava. Grazie per il tuo aiuto:] – Kounavi

+0

Aggiornamento: Ancora non (controlla i miei commenti nel post superiore) – Kounavi

+2

Basta cambiare il doppio tra virgolette singole e l'espansione verrà ritardata fino all'esecuzione del comando trap, ad esempio con 'trap 'echo" $ PATH "INT" qualsiasi modifica di PATH sarà visibile alla funzione trap. –

Problemi correlati