Tín hiệu 0 trong lệnh bẫy là gì?


12

Tôi đang làm theo hướng dẫn này về cách thiết lập xác thực SSH không mật khẩu với ssh-agent.

Để khởi động ssh-agent, tác giả đề xuất đoạn mã sau .bash_profile:

SSHAGENT=/usr/bin/ssh-agent
SSHAGENTARGS="-s"
if [ -z "$SSH_AUTH_SOCK" -a -x "$SSHAGENT" ]; then
    eval `$SSHAGENT $SSHAGENTARGS`
    trap "kill $SSH_AGENT_PID" 0
fi

Tôi không hiểu tại sao đó là tín hiệu bẫy 0. Theo tín hiệu man 7 , không có tín hiệu đó.

Đây chỉ là một lỗi đánh máy hoặc lỗi hoặc điều này thực sự đạt được một cái gì đó?

Câu trả lời:


19

Từ hướng dẫn bash :

trap [-lp] [[arg] sigspec ...]

... Nếu một sigspec là EXIT (0) thì lệnh arg được thực thi khi thoát khỏi trình bao.


13
Chính xác. Trong trường hợp một người đọc đến đây vì tiêu đề của câu hỏi, lưu ý rằng đây là ý nghĩa của lệnh 0shell trap. Khi gửi tín hiệu với kill, số tín hiệu bằng 0 có nghĩa là không gửi tín hiệu sau tất cả; đây là một cách để kiểm tra sự tồn tại của quá trình đích.
Gilles 'SO- ngừng trở nên xấu xa'

@Mat: Cảm ơn rất nhiều. Tôi đã đọc man 1 bẫy ...
Christoph Wurm

1
Nhưng nó không có trong danh sách đầu ra của trap -l!
amphetamachine

Bạn có thể vui lòng giải quyết các trường hợp khi kịch bản có nguồn gốc?
Eric

1

Như @Mat hiển thị trong câu trả lời của anh ấy, SIGSPEC bằng 0, khi được sử dụng trên traplệnh sẽ khiến traplệnh chạy khi tập lệnh thoát.

Ví dụ này minh họa những gì xảy ra.

$ cat tr.bash 
#!/bin/bash

echo "PID: $$"

trap 'echo hi; exit 1' 0 1 2 15

while [ 1 ]; do
    sleep 3
done

Khi chúng tôi chạy này:

$ ./tr.bash 
PID: 24086

Nó ngồi đây chờ đợi vô thời hạn. Trong một cửa sổ khác nếu bây giờ chúng ta gửi killtín hiệu đến nó, bạn sẽ thấy rằng kill -0sẽ không giết quá trình, mặc dù tín hiệu 0 được liệt kê trong traplệnh.

$ kill -0 $(pgrep tr.bash)
$

Tuy nhiên, nếu chúng ta killtập lệnh sử dụng tín hiệu 1 , kill -1:

$ kill -1 $(pgrep tr.bash)
$

Chúng ta sẽ thấy rằng tập lệnh thoát và in thông báo "hi" 2 lần. Cái đầu tiên cho tín hiệu 1 và cái thứ hai vì đoạn script đã thoát.

$ ./tr.bash 
PID: 24086
hi
hi

0

bẫy trên 0 được chạy khi thoát khỏi vỏ. Nó thường được sử dụng để dọn dẹp các tệp tmp ở một nơi luôn được thực thi:

tmp = / tmp / myscript. $$

bẫy 'rm -f $ tmp; thoát '0 1 2 15

do_a_bunch_of_ ware

lối ra

lối ra ở cuối bẫy thoát ra khỏi vỏ khi dọn dẹp với trạng thái đúng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.