2012-02-29 45 views
7

Tôi đã tìm kiếm ở khắp mọi nơi và tôi đã tin rằng không có cách nào để làm điều đó ngoài việc có các biến toàn cầu nhưng tôi tin rằng guru's trong stackoverflow.com có ​​thể giúp tôi:Chức năng bẫy bằng cách truyền các đối số?

Có bất kỳ cách nào trong bash để bẫy một chức năng bằng cách chuyển các đối số cho nó?
Ví dụ: trap <function_name> <arg_1> <arg_2> SIGINT?

Trả lời

13

trap cho phép bạn chỉ định một lệnh tùy ý (hoặc chuỗi lệnh), nhưng bạn phải chuyển lệnh đó dưới dạng một đối số. Ví dụ, điều này:

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

sẽ chạy này:

foo bar baz | bip && fred barney ; wilma 

bất cứ khi nào vỏ nhận SIGINT. Trong trường hợp của bạn, có vẻ như bạn muốn:

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

Yeap! Thanks:] – Kounavi

+0

Trên thực tế nó không hoạt động kể từ khi gọi bẫy "myfunction $ arg_1 $ arg_2" SIGINT SIGTERM có nghĩa là khi Ctrl-C được nhấn giá trị cũ của $ arg_1 $ arg_2 trong đó bảo quản và không phải là bản cập nhật. Đoán tôi sẽ sử dụng một chức năng wrapper hoặc làm cho các đối số toàn cầu kể từ khi tôi không thể làm cho công việc theo cách tôi dự định:/P.S .: Có vấn đề mà tôi sử dụng double_quotes và không duy nhất như trong ví dụ của bạn? – Kounavi

+1

@Kounavi: Như bạn đã đoán - bạn cần sử dụng dấu nháy đơn, chứ không phải dấu ngoặc kép. – ruakh

2

Có lẽ tôi là sự hiểu lầm bạn, nhưng ... Đây là hợp pháp:

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

Chỉ có dấu ngoặc kép duy nhất làm việc với các biến loại $ arg1, $ arg2 vv Nhưng, có đó là những gì tôi cần! ;) – Kounavi

+1

Tôi vui vì Michal đã giải thích kỹ lưỡng và bạn đã làm việc đó hiệu quả. :) – rsaw

1

Tôi không chắc là tôi hiểu một cách chính xác những gì bạn có ý nghĩa , nhưng nếu bạn muốn thực hiện một trình xử lý tín hiệu, hãy gọi một hàm và chuyển các tham số đó, trap "function arg1 arg2" SIGNAL sẽ hoạt động. Ví dụ: trap "ls -lh /" INT sẽ khiến Ctrl + C trong trình bao của bạn dẫn đến ls -lh / (chương trình có 2 arg) được gọi.

+0

Thực ra tôi đã không sử dụng dấu ngoặc kép và nó không hoạt động. Cảm ơn sự giúp đỡ của bạn:] – Kounavi

+0

Cập nhật: Vẫn không (kiểm tra ý kiến ​​của tôi ở đầu bài viết) – Kounavi

+2

Chỉ cần thay đổi gấp đôi thành dấu nháy đơn và mở rộng sẽ bị trì hoãn cho đến khi lệnh bẫy được thực hiện, ví dụ với 'trap 'echo" $ PATH "'INT' bất kỳ thay đổi nào đối với PATH sẽ hiển thị với hàm bẫy. –

Các vấn đề liên quan