2012-02-29 14 views
7

Szukałem wszędzie i doszedłem do przekonania, że ​​nie ma sposobu, aby to zrobić inny niż o zmiennych globalnych, ale wierzę, guru w stackoverflow.com może być w stanie mi pomóc:Funkcja pułapki przez przekazywanie argumentów?

Czy istnieje jakikolwiek sposób w bashu, aby przechwycić funkcję, przekazując do niej argumenty?
Na przykład: trap <function_name> <arg_1> <arg_2> SIGINT?

Odpowiedz

13

trap pozwala określić dowolne polecenie (lub sekwencję poleceń), ale trzeba przekazać to polecenie jako pojedynczy argument. Na przykład, w tym:

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

będzie działać następująco:

foo bar baz | bip && fred barney ; wilma 

gdy powłoka otrzymuje SIGINT. W twoim przypadku, to brzmi jak chcesz:

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

Yeap! Dzięki:] – Kounavi

+0

Właściwie to nie działało odkąd pułapka "myfunction $ arg_1 $ arg_2" SIGINT SIGTERM oznaczało, że po naciśnięciu Ctrl-C stare wartości $ arg_1 $ arg_2 zostały zachowane, a nie aktualizacje. Zgaduję, że użyję funkcji wrappera lub sprawię, że argumenty będą globalne, ponieważ nie mogę wykonać tej pracy tak, jak zamierzałem:/P.S .: Czy to ważne, że użyłem double_quotes, a nie singla, jak w twoim przykładzie? – Kounavi

+1

@Kounavi: Jak można się domyślić, musisz używać pojedynczych cudzysłowów, a nie podwójnych cudzysłowów. – ruakh

2

Może jestem nieporozumienie, ale ... to jest legalne:

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

Tylko pojedyncze cytaty działały ze zmiennymi typu $ arg1, $ arg2 itd. Ale, tak, właśnie tego potrzebowałem! ;) – Kounavi

+1

Cieszę się, że Michał wyjaśnił to tak dokładnie i że udało się. :) – rsaw

1

Nie jestem pewien, czy rozumiem co masz na myśli , ale jeśli chcesz, aby operator sygnału zadzwonił do funkcji i przekazał jej parametry, powinien zadziałać trap "function arg1 arg2" SIGNAL. Na przykład trap "ls -lh /" INT spowoduje, że Ctrl + C w twojej powłoce spowoduje wywołanie ls -lh / (program z 2 args).

+0

Właściwie to nie używałem cytatów i to nie działało. Dzięki za pomoc:] – Kounavi

+0

Aktualizacja: Nadal nie ma (sprawdź moje komentarze w górnym poście) – Kounavi

+2

Po prostu zmień dwukrotnie na pojedyncze cudzysłowy, a rozwinięcie zostanie opóźnione do wykonania polecenia pułapki, na przykład z "pułapką" echa " $ PATH "'INT' wszelkie zmiany w PATH będą widoczne dla funkcji pułapki. –