जाल एक उपधारा द्वारा विरासत में मिला है?


14

मैंने निम्नलिखित स्क्रिप्ट की कोशिश की:

#!/bin/bash
trap 'echo "touching a file" && touch $FILE' EXIT

foo1(){
        echo "foo1"
}
foo(){
        echo "foo"
        export FILE=${FILE:-/tmp/file1}
}
(foo1)
foo

उपरोक्त स्क्रिप्ट के लिए आउटपुट था:

[root@usr1 my_tests]# ./test.sh
foo1
foo
touching a file

हालाँकि मैं उम्मीद कर रहा था कि जाल से बाहर निकलने के बाद भी कॉल किया जाएगा foo1, जिसे सबशेल कहा जाता है।

  • क्या यह अपेक्षित है?
  • है trapएक subshell द्वारा विरासत में मिला?
  • यदि हाँ, तो किस मामले में trapएक उपधारा द्वारा विरासत में मिली है?

जवाबों:


10

ट्रैप हैंडलर कभी भी उपधाराओं द्वारा विरासत में नहीं मिले हैं। यह POSIX द्वारा निर्दिष्ट किया गया है :

जब कोई सबस्क्रिप्शन दर्ज किया जाता है, तो जिन जालों को अनदेखा नहीं किया जा रहा है, उन्हें डिफ़ॉल्ट क्रियाओं पर सेट किया जाता है।

ध्यान दें कि उपेक्षित संकेतों ( trap '' SIGFOO) को उपधारा में अनदेखा किया गया है (और शेल द्वारा लॉन्च किए गए बाहरी कार्यक्रमों में भी)।


3
बैश में आप set -Eइनहेरिट ट्रैप को सब्सक्राइब कर सकते हैं , लेकिन सही (कम से कम मेरे अनुभव में) पाने के लिए यह बहुत मुश्किल है।
ड्रैगन 788

मुझे नहीं पता कि यह सभी जाल के लिए काम करता है। मुझे पता है कि यह ERR
yosefrow

4

trapउपधाराओं के लिए प्रचारित नहीं किया जाता है, लेकिन कुछ तरीके उपधारा को मूल शैल के जाल की रिपोर्ट करने की अनुमति देते हैं और अन्य नहीं। मैंने मैश पर कुछ टेस्ट बैश के साथ किए।

GNU बैश, संस्करण 4.4.12 (1) -release (x86_64-apple-darwin16.3.0):

trap 'echo hello' EXIT
trap # trap -- 'echo hello' EXIT
echo "$(trap)" # trap -- 'echo hello' EXIT
trap | cat # trap -- 'echo hello' EXIT
(trap) | cat # trap -- 'echo hello' EXIT
cat < <(trap) # empty
cat <<< "$(trap)" # empty
bash -c 'trap' # empty
trap & # trap -- 'echo hello' EXIT

GNU बैश, संस्करण 3.2.57 (1) -release (x86_64-apple-darwin16):

trap 'echo hello' EXIT
trap # trap -- 'echo hello' EXIT
echo "$(trap)" # trap -- 'echo hello' EXIT
trap > >(cat) # trap -- 'echo hello' EXIT
trap | cat # empty
(trap) | cat # empty
cat < <(trap) # empty
cat <<< "$(trap)" # empty
bash -c 'trap' # empty
trap & # empty

यह जानना अच्छा है कि trap_output="$(trap)"ट्रैप आउटपुट कैप्चर करने के लिए काम करेगा। मैं इसे करने के लिए किसी भी अन्य तरीके के बारे में सोच नहीं सकता, अगर वह काम करने के अलावा trap >trap_output_fileएक फ़ाइल के लिए यह करने के लिए काम नहीं किया (पेंडो में काम नहीं करेगा bash 3.2.57) और फिर इसे वापस पढ़ने के साथtrap_output="$(<trap_output_file)"

फीफो काम नहीं करेगा bash 3.2.57क्योंकि इसके trap &लिए खाली है bash 3.2.57लेकिन नहींbash 4.4.12

GNU बैश, संस्करण 4.4.12 (1) -release (x86_64-apple-darwin16.3.0):

mkfifo /tmp/fifo; trap >/tmp/fifo & trap_output=$(</tmp/fifo); rm -f /tmp/fifo; echo "$trap_output"
# trap -- 'echo hello' EXIT

mkfifo /tmp/fifo; trap_output=$(</tmp/fifo) & trap >/tmp/fifo; rm -f /tmp/fifo; echo "$trap_output"
# empty because trap_output=$(</tmp/fifo) sets the variable in a subshell

GNU बैश, संस्करण 3.2.57 (1) -release (x86_64-apple-darwin16):

mkfifo /tmp/fifo; trap >/tmp/fifo & trap_output=$(</tmp/fifo); rm -f /tmp/fifo; echo "$trap_output"
# empty because trap >/tmp/fifo & is empty since it uses trap &

mkfifo /tmp/fifo; trap_output=$(</tmp/fifo) & trap >/tmp/fifo; rm -f /tmp/fifo; echo "$trap_output"
# empty because trap_output=$(</tmp/fifo) sets the variable in a subshell

2

trap उप-गोले के लिए परिभाषाओं का प्रचार नहीं किया जाता है।

द्वारा सत्यापित करें:

trap "echo bla" 1 2 3"

(trap)


2
कई गोले (trap)एक विशेष मामले के रूप में संभालते हैं , ताकि उपधारा पैरेंट शेल के जाल को रिपोर्ट कर सके (लेकिन वास्तव में उपयोग नहीं)। इसलिए यह परीक्षण हमेशा विश्वसनीय नहीं होता है।
जिग्ग्लीनागा

यह बॉर्न शैल के साथ काम करता है और यह derivates है: ksh88, bosh(schily बॉर्न शैल) और heirloom-sh। आप सही हैं: ksh93अलग तरह से व्यवहार करता है।
schily

यह बाश में काम नहीं करता है, जो प्रश्न में स्क्रिप्ट का उपयोग करता है।
जिगलीनागा

ठीक है, यह काम करता है: bashयदि आप कॉल करते हैं तो कुछ भी आउटपुट नहीं करता है (trap)
शास्त्री
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.