लर्निंग बैश बुक में उल्लेख किया गया है कि एक उपधारा केवल पर्यावरण चर और फ़ाइल विवरणक, इत्यादि का वारिस करेगा, और यह कि निर्यात नहीं होने वाले चर विरासत में नहीं मिलेंगे:
$ var=15
$ (echo $var)
15
$ ./file # this file include the same command echo $var
$
जैसा कि मुझे पता है कि शेल के लिए ()
और इसके लिए दो उप-खंड बनाए जाएंगे ./file
, लेकिन ()
मामले में उप- var
चर चर की पहचान क्यों करता है हालांकि यह निर्यात नहीं किया जाता है और ./file
मामले में इसकी पहचान नहीं की गई है?
# Strace for ()
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f24558b1a10) = 25617
# Strace for ./file
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f24558b1a10) = 25631
मैंने strace
यह पता लगाने की कोशिश की कि यह कैसे होता है और आश्चर्यजनक रूप से मैंने पाया कि बैश क्लोन सिस्टम कॉल के लिए एक ही तर्क का उपयोग करेगा, तो इसका मतलब है कि दोनों में कांटे की प्रक्रिया ()
और ./file
माता-पिता की समान प्रक्रिया पता स्थान होनी चाहिए, इसलिए में ()
मामला subshell को दिखाई varible है और उसी के लिए नहीं होता है ./file
, हालांकि एक ही तर्क क्लोन सिस्टम कॉल पर आधारित है, मामला?