जवाबों:
एक बार जब आप निष्पादित करते हैं sudo suया एक नया शेल बनाया जा रहा है।su user
निष्पादन exit(या Ctrl+ D) नव निर्मित शेल से बाहर निकलेगा और आपको आपके पिछले शेल में लौटा देगा।
प्रारंभिक बिंदु - बैश शेल PID 25050 पर चल रहा है:
$ ps
PID TTY TIME CMD
25050 pts/17 00:00:00 bash
25200 pts/17 00:00:00 ps
रनिंग sudo suएक नई बैश प्रक्रिया बनाती है जो PID 25203 पर चल रही है:
$ sudo su
# ps
PID TTY TIME CMD
25201 pts/17 00:00:00 sudo
25202 pts/17 00:00:00 su
25203 pts/17 00:00:00 bash
25213 pts/17 00:00:00 ps
# exit
बाहर निकलने sudo suऔर प्रारंभिक बिंदु पर लौटने - पीआईडी 25050 पर बैश शेल चल रहा है:
$ ps
PID TTY TIME CMD
25050 pts/17 00:00:00 bash
25214 pts/17 00:00:00 ps
$
बाल प्रक्रियाएं आप एक शेल से चलाते हैं, जिसमें बाल के गोले भी शामिल हैं, एक ही टर्मिनल का स्वचालित रूप से उपयोग करते हैं। यह sudoकिसी भी तरह से विशिष्ट नहीं है - यह आमतौर पर यह है कि जब आप अपने शेल से कोई प्रोग्राम चलाते हैं तो यह कैसे काम करता है।
गोले और टर्मिनल अलग-अलग चीजें हैं। एक शेल वह है जिसे आप टर्मिनल में कमांड चलाने के लिए उपयोग करते हैं । एक शेल अंतःक्रियात्मक रूप से काम कर सकता है - यह आपको एक संकेत देता है, आप इसे एक कमांड देते हैं, यह कमांड चलाता है या यह त्रुटि के बारे में बताता है कि यह क्यों नहीं हो सकता है, और प्रक्रिया तब तक दोहराती है जब तक आप शेल को छोड़ नहीं देते। या यह एक स्क्रिप्ट को चलाने के लिए, निर्बाध रूप से काम कर सकता है ।
भले ही आपका टर्मिनल (शायद!) का अनुकरण किया गया है , भौतिक नहीं है , फिर भी यूनिक्स जैसे ऑपरेटिंग सिस्टम आपके प्रत्येक टर्मिनल को डिवाइस नोड्स प्रदान करते हैं, और आप यह जांच सकते हैं कि ttyकमांड के साथ आप किस टर्मिनल का उपयोग कर रहे हैं । यह आमतौर पर किया जाएगा /dev/pts/0, /dev/pts/1, /dev/pts/2, आदि , एक के लिए टर्मिनल विंडो या SSH कनेक्शन , या /dev/tty1, /dev/tty2, आदि , के लिए आभासी शान्ति । वास्तव में आपको क्या ttyबताना है कि कौन सा टर्मिनल, यदि कोई हो, से इनपुट लिया जा रहा है; विवरण के लिए नीचे देखें।
ek@Io:~$ tty
/dev/pts/1
ek@Io:~$ bash
ek@Io:~$ tty
/dev/pts/1
ek@Io:~$ exit
exit
ek@Io:~$ sudo su
[sudo] password for ek:
root@Io:/home/ek# tty
/dev/pts/1
root@Io:/home/ek# exit
exit
ek@Io:~$
आप देख सकते हैं कि, भले ही यारोन के रूप मेंsudo su एक नया शेल बनाता है , बहुत अच्छी तरह से समझाता है , जिस टर्मिनल का आप उपयोग कर रहे हैं वह बदलता नहीं है।
बेशक, यह देखने का एक और तरीका है कि टर्मिनल समान है: आप अभी भी उसी तरह और उसी स्थान पर इनपुट लिख रहे हैं, और आउटपुट को उसी तरह और उसी स्थान पर पढ़ रहे हैं।
अधिकांश आदेशों आप एक खोल में चला - जैसे ls, cp, mv, rm, touch, wc, du, df, ssh, su, sudo, sh, bash, और कई और अधिक - कारण एक बच्चे की प्रक्रिया बनाया जाना। इस बच्चे की प्रक्रिया में आपके माता-पिता के रूप में आपका खोल है लेकिन यह एक अलग कार्यक्रम है। डिफ़ॉल्ट रूप से, यह आपके शेल के समान टर्मिनल से जुड़ा होता है।
आपका शेल अभी भी चल रहा है, लेकिन यह प्रोग्राम को समाप्त करने के लिए पृष्ठभूमि में इंतजार कर रहा है (या आप इसे निलंबित करने के लिए )। जब कार्यक्रम समाप्त हो जाता है, तो शेल अभी भी चल रहा है और यह आपके अगले कमांड के लिए संकेत देते हुए, ऑपरेशन फिर से शुरू करता है।
ये प्रमुख अपवाद हैं:
cdएक नई प्रक्रिया बिल्कुल नहीं बनाते हैं, जब तक कि वे एक निर्माण में उपयोग नहीं किए जाते हैं जो एक उपधारा ( यहां समझाया गया है ), जैसे कि ( )समूह और पाइपलाइन ।&। ( your-command arguments... &)disownहालाँकि मैं वास्तव में इस बात को अपवाद नहीं मानूंगा कि बाल प्रक्रियाएँ एक ही टर्मिनल से उनके माता-पिता के रूप में जुड़ी हुई हैं, ध्यान दें कि आप जिस प्रक्रिया से किसी टर्मिनल में शेल से चलते हैं, वह हमेशा उस टर्मिनल से इनपुट नहीं लेगा या उस टर्मिनल को आउटपुट नहीं भेजेगा। :
<, >और >>ऑपरेटरों।|चूंकि ttyकमांड केवल यह जांचता है कि उसका मानक इनपुट किस टर्मिनल का है, आप इसे "मूर्ख" कर सकते हैं:
ek@Io:~$ tty
/dev/pts/1
ek@Io:~$ tty </dev/pts/0
/dev/pts/0
या, कम श्रद्धापूर्वक:
ek@Io:~$ tty </dev/null # not a terminal
not a tty
ek@Io:~$ tty <&- # closes the input stream
not a tty