2012-02-29 11 views
7

Ben her yerde aradım ve ben genel değişkenleri olan dışında başka yapmak için hiçbir yol yoktur inanmak için geldim ama stackoverflow.com guru bana yardım edebilir inanıyoruz:Trap işlevi argümanları ileterek mi?

var mı Bir işlevi, argümanları ona geçirerek yakalamak için herhangi bir şekilde bash?
Örneğin, trap <function_name> <arg_1> <arg_2> SIGINT?

cevap

13

trap isteğe bağlı bir komut (veya komut dizisi) belirtmenize izin verir, ancak bu komutu tek bir argüman olarak iletmeniz gerekir. Örneğin, bu:

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

bu çalışır:

foo bar baz | bip && fred barney ; wilma 

kabuk SIGINT aldığı zaman. Sana yanlış anlama ediyorum

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

Yeap! Teşekkürler:] – Kounavi

+0

Aslında tuzak çağırmaktan beri işe yaramadı "myfunction $ arg_1 $ arg_2" SIGINT SIGTERM, Ctrl-C tuşlarına basıldığında, güncellemelerin değil, korunan $ arg_1 $ arg_2'nin eski değerlerini ifade ediyordu. Sanırım bir sarıcı işlevi kullanacağım ya da bu çalışmayı istediğim şekilde yapamayacağım için argümanları global hale getireceğim:/P.S .: Örnekte olduğu gibi değil, double_quotes kullanmamın önemi var mı? – Kounavi

+1

@Kounavi: Tahmin ettiğiniz gibi, tek tırnak işaretleri değil, çift tırnak kullanmanız gerekir. – ruakh

2

ama ... Bu yasaldır: Senin durumunda, bu istediğiniz gibi geliyor

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

Sadece tek tırnaklar, $ arg1, $ arg2 vb. Değişkenleriyle çalıştı. Ama, evet, ihtiyacım olan buydu! ;) – Kounavi

+1

Michal'in bunu çok iyi anlattığına ve işe yaradığına sevindiğine sevindim. :) – rsaw

1

ben doğru ne demek istediğini anlayamadım Ancak, bir sinyal işleyici yapmak istediğinizde, bir işlevi çağırıp parametreleri geçirirseniz, trap "function arg1 arg2" SIGNAL çalışmalıdır. Örneğin, trap "ls -lh /" INT, kabuğunuzdaki Ctrl + C'nin ls -lh / (2 argsli program) çağrılmasına yol açacaktır.

+0

Aslında tırnak kullanmıyordum ve çalışmıyordu. Yardımınız için teşekkür ederiz:] – Kounavi

+0

Güncelleme: Yine de (benim yorumumu en üstteki yazıya bak) – Kounavi

+2

Sadece tek tırnak işaretini değiştir ve genişleme, trap komutu çalıştırılana kadar ertelenecek, örneğin 'trap' echo ile $ PATH "'INT", PATH'deki herhangi bir değişiklik, tuzak işlevine görünecektir. –