ट्रैप कमांड में संकेत 0 क्या है?


12

मैं ssh- एजेंट के साथ पासवर्ड रहित SSH प्रमाणीकरण सेट करने के तरीके के बारे में इस गाइड का अनुसरण कर रहा हूं ।

Ssh-agent शुरू करने के लिए लेखक निम्नलिखित कोड सुझाता है .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

मुझे समझ नहीं आ रहा है कि यह सिग्नल क्यों फँस रहा है। मैन 7 सिग्नल के अनुसार ऐसा कोई सिग्नल नहीं है।

क्या यह सिर्फ एक टाइपो या बग है या यह वास्तव में कुछ हासिल करता है?

जवाबों:


19

से बैश मैनुअल :

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

... यदि कोई sigspec EXIT (0) है तो कमांड arg को शेल से बाहर निकलने पर निष्पादित किया जाता है।


13
सही बात। यदि प्रश्न के शीर्षक के कारण कोई पाठक यहां आया है, तो ध्यान दें कि 0शेल trapकमांड में इसका अर्थ है । जब एक सिग्नल भेजते हैं kill, तो 0 की एक सिग्नल संख्या का मतलब सभी के बाद सिग्नल नहीं भेजना है; यह लक्ष्य प्रक्रिया के अस्तित्व का परीक्षण करने का एक तरीका है।
गिल्स एसओ- बुराई को रोकें '

@Mat: बहुत बहुत धन्यवाद। मैं आदमी 1 जाल पढ़ रहा था ...
क्रिस्टोफ Wurm

1
लेकिन यह सूची आउटपुट में नहीं है trap -l!
एम्फ़ैटेमाचिन

क्या आप कृपया उस मामले को संबोधित कर सकते हैं, जब लिपि में खटास है?
एरिक

1

जैसा कि @Mat अपने जवाब में दिखाता है, 0 का एक SIGSPEC, जब trapकमांड पर प्रयोग किया जाता है, तो trapस्क्रिप्ट चलने पर कमांड चलने का कारण होगा ।

यह उदाहरण दिखाता है कि क्या होता है।

$ cat tr.bash 
#!/bin/bash

echo "PID: $$"

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

while [ 1 ]; do
    sleep 3
done

जब हम इसे चलाते हैं:

$ ./tr.bash 
PID: 24086

यह यहाँ अनिश्चित काल तक प्रतीक्षा करता है। एक अन्य विंडो में यदि हम अब killइसे सिग्नल भेजते हैं, तो आप देखेंगे कि कमांड kill -0में संकेत 0 सूचीबद्ध होने के बावजूद, इस प्रक्रिया को नहीं मारेगा trap

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

हालांकि अगर हम killसंकेत 1 का उपयोग कर स्क्रिप्ट kill -1,:

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

हम देखेंगे कि स्क्रिप्ट से बाहर निकलता है, और संदेश को प्रिंट करता है, "हाय" 2 बार। सिग्नल 1 के लिए पहला, और दूसरा क्योंकि स्क्रिप्ट बाहर निकल गई।

$ ./tr.bash 
PID: 24086
hi
hi

0

0 पर ट्रैप तब चलाया जाता है जब शेल बाहर निकलता है। यह आमतौर पर एक जगह पर tmp फ़ाइलों को साफ करने के लिए उपयोग किया जाता है जिसे हमेशा निष्पादित किया जाता है:

tmp = / tmp / myscript। $$

जाल 'rm -f $ tmp; बाहर निकलें '0 1 2 15

do_a_bunch_of_stuff

बाहर जाएं

जाल के अंत में निकास सही स्थिति के साथ सफाई पर खोल से बाहर निकलता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.