निष्पादन कमांड के संभावित उपयोग क्या हैं?


10

मैं execकमांड सीख रहा हूं । मुझे पता है कि execकमांड ने उस प्रक्रिया को बदल दिया है जिसने इसे शुरू किया है। इसलिए यह उस प्रक्रिया पर वापस लौटना संभव नहीं है जो execकमांड द्वारा प्रतिस्थापित किया गया है।

कोई यह कह सकता है कि इसका उद्देश्य उस प्रक्रिया पर लौटना असंभव है, जिसने इसे शुरू किया था।

लेकिन execएक कमांड के रूप में कुछ उपलब्ध होने के लिए अन्य उपयोग क्या हैं ?



1
विकिपीडिया लेख से: "रैपर स्क्रिप्ट अक्सर पर्यावरण चर या अन्य कॉन्फ़िगरेशन सेट करने के बाद प्रोग्राम (या तो सीधे या दुभाषिया या वर्चुअल मशीन के माध्यम से) चलाने के लिए इस कमांड का उपयोग करते हैं।"
knb


2
व्यक्तिगत रूप से, मुझे exec ssh server-that-does-byobu-on-login.example.comयह बहुत भाता है, इसमें ^ A ^ D पूरी तरह से टर्मिनल को बंद कर देता है। (आम तौर पर, exec byobuया (या exec screen, exec tmux)।
विलीहैम टोटलैंड

जवाबों:


9

आवरण लिपि में

exec मुख्य रूप से आवरण लिपियों में प्रयोग किया जाता है।

यदि आप मुख्य कार्यक्रम को निष्पादित करने से पहले किसी प्रोग्राम के लिए वातावरण को संशोधित करना चाहते हैं, तो आप अक्सर एक स्क्रिप्ट लिखेंगे और इसके अंत में मुख्य प्रोग्राम शुरू करेंगे। लेकिन उस समय स्मृति में रहने के लिए स्क्रिप्ट की कोई आवश्यकता नहीं है। तो, execइन मामलों में उपयोग किया जाता है ताकि, मुख्य कार्यक्रम मातृ लिपि को प्रतिस्थापित कर सके।

यहाँ इसका एक व्यावहारिक उदाहरण है। यह mate-terminal.wrapperस्क्रिप्ट मेट-टर्मिनल के साथ आती है। यह mate-terminalउपयोगकर्ता के वातावरण की जाँच करके कुछ अतिरिक्त तर्कों के साथ शुरू होता है।

#!/usr/bin/perl -w

my $login=0;

while ($opt = shift(@ARGV))
{
    if ($opt eq '-display')
    {
        $ENV{'DISPLAY'} = shift(@ARGV);
    }
    elsif ($opt eq '-name')
    {
        $arg = shift(@ARGV);
        push(@args, "--window-with-profile=$arg");
    }
    elsif ($opt eq '-n')
    {
        # Accept but ignore
        print STDERR "$0: to set an icon, please use -name <profile> and set a profile icon\n"
    }
    elsif ($opt eq '-T' || $opt eq '-title')
    {
        push(@args, '-t', shift(@ARGV));
    }
    elsif ($opt eq '-ls')
    {
        $login = 1;
    }
    elsif ($opt eq '+ls')
    {
        $login = 0;
    }
    elsif ($opt eq '-geometry')
    {
        $arg = shift(@ARGV);
        push(@args, "--geometry=$arg");
    }
    elsif ($opt eq '-fn')
    {
        $arg = shift(@ARGV);
        push(@args, "--font=$arg");
    }
    elsif ($opt eq '-fg')
    {
        $arg = shift(@ARGV);
        push(@args, "--foreground=$arg");
    }
    elsif ($opt eq '-bg')
    {
        $arg = shift(@ARGV);
        push(@args, "--background=$arg");
    }
    elsif ($opt eq '-tn')
    {
       $arg = shift(@ARGV);
       push(@args, "--termname=$arg");
    }
    elsif ($opt eq '-e')
    {
        $arg = shift(@ARGV);
        if (@ARGV)
        {
            push(@args, '-x', $arg, @ARGV);
            last;
        }
        else
        {
            push(@args, '-e', $arg);
        }
        last;
    }
    elsif ($opt eq '-h' || $opt eq '--help')
    {
        push(@args, '--help');
    }
}
if ($login == 1)
{
    @args = ('--login', @args);
}
exec('mate-terminal',@args);

यहां ध्यान देने वाली बात यह है कि एक execकॉल है, जो इस स्क्रिप्ट को मेमोरी में बदल देता है।

यहां यूनिक्स एंड लिनक्स स्टैकएक्सचेंज साइट - https://unix.stackexchange.com/q/270929/19288

फ़ाइल-डिस्क्रिप्टर को पुनर्निर्देशित करना

execफ़ाइल-डिस्क्रिप्टर को रीडायरेक्ट करने में एक और आम उपयोग है। stdin, stdout, stderrकार्यकारी का उपयोग करके फ़ाइलें पर पुनः निर्देशित किया जा सकता है।

  1. पुनर्निर्देशन stdout- exec 1>fileमानक आउटपुट fileका कारण वर्तमान शेल सत्र के अंत के लिए एक फ़ाइल का नाम होगा । डिस्प्ले में आउटपुट के लिए कुछ भी फाइल में होगा।

  2. रीडायरेक्टिंग stdin- इसका इस्तेमाल stdinकिसी फाइल को रीडायरेक्ट करने के लिए भी किया जा सकता है । उदाहरण के लिए, यदि आप किसी स्क्रिप्ट फ़ाइल को निष्पादित करना चाहते हैं, तो आप फ़ाइल का उपयोग करके script.shपुनर्निर्देशित कर सकते हैं ।stdinexec 0<script.sh


ठीक है। बाद में 'मेट-टर्मिनल' के पास पीआईडी ​​होगी जिसमें रैपर-स्क्रिप्ट होगी? और स्मृति का उपयोग करेंगे जो आवरण-लिपि का उपयोग किया था? इसलिए रैपर-स्क्रिप्ट गायब हो गई है। अन्यथा सिस्टम पर अलग-अलग प्रक्रियाओं के रूप में दो स्क्रिप्ट मौजूद होंगी (दो अलग-अलग पीआईडी ​​के साथ)?
मचेक

@ मेइचेक हाँ। वे उसी पीआईडी
अनवर

@mizech को यह जानने में खुशी हुई कि :)
अनवर

1
बहुत बढ़िया उदाहरण, जो इसे वास्तव में स्पष्ट करता है
Zanna

यह उत्तर आंशिक है और महत्वपूर्ण (और विशिष्ट) में से एक का उपयोग करता है और execइसका उपयोग फ़ाइल विवरणकर्ताओं के पुनर्निर्देशन में किया जाता है।
heemayl

9

exec आदेश निर्दिष्ट कमांड के साथ वर्तमान खोल प्रक्रिया बदल देता है। आम तौर पर, जब आप कमांड चलाते हैं तो एक नई प्रक्रिया शुरू होती है। exec आदेश एक नई प्रक्रिया अंडे नहीं है। इसके बजाय, नई कमांड के साथ वर्तमान प्रक्रिया खत्म हो गई है। दूसरे शब्दों में execएक नई प्रक्रिया बनाए बिना वर्तमान शेल के स्थान पर कमांड को निष्पादित किया जाता है।

निष्पादन कमांड के तीन सबसे आम उपयोग हैं:

1. प्रक्रिया का प्रतिस्थापन

उदाहरण -1: यदि आप एक नयाbashखोलखोलते हैं

$ bash 

में pstreeयह कैसा दिखता

├─gnome टर्मिनल
        ├─bash───bash───pstree

पिछला bashशेल अभी भी है और आपको एक नया bashशेल मिला है । जबकि यदि आप एक नया बैश खोल के रूप में,

$ exec bash

pstreeशो

├─gnome टर्मिनल
        ├─bash───pstree

यहां पुराने bashको नए के साथ बदल दिया गया है। यह एक कमांड में कई लॉगिन से बाहर निकलने के लिए विशेष रूप से उपयोगी है। यह अधिक सुरक्षित है और गलती से एक खुला टर्मिनल छोड़ने का मौका मिटा देता है। रूट और उपयोगकर्ता दोनों से एक आदेश के साथ बाहर निकलें देखें

उदाहरण -2: आप एक फ़ाइल खोल सकते हैं

$ exec vi filename.txt

जब आप बाहर निकलते हैं viतो टर्मिनल को अलग से बंद करने की आवश्यकता नहीं होती है क्योंकि शेल पहले से ही बदल दिया जाता है। जैसे ही आप vi बंद करते हैं टर्मिनल भी बंद हो जाता है।

2. शेल स्क्रिप्ट के भीतर फ़ाइल डिस्क्रिप्टर के पुनर्निर्देशन की एक विधि

exec आदेश भी गतिशील रूप से खुला शेल स्क्रिप्ट में इस्तेमाल किया जा सकता है, करीब है, और फ़ाइल वर्णनकर्ता कॉपी। जो कमांड इनवेशन स्ट्रिंग के बजाय शेल स्क्रिप्ट के अंदर विभिन्न फाइलों में STDIN, STDERR, STDOUT और अन्य फाइल डिस्क्रिप्टर का पुनर्निर्देशन करने की अनुमति देता है। यदि आप कोई आदेश या तर्क निर्दिष्ट नहीं करते हैं, तो आप इन कार्यों को करने के लिए पुनर्निर्देशन प्रतीकों और फ़ाइल विवरणकों को निर्दिष्ट कर सकते हैं।

कहते हैं कि आपके पास एक शेल स्क्रिप्ट है script.shजिसे आप एक लॉग फ़ाइल के लिए चाहते हैं script.log, आप इसका उपयोग कर सकते हैं exec,

LOG=/path/to/script.log
exec 1>>$LOG
exec 2>&1

जो के बराबर है

./script &>> /path/to/script.log
./script >>  /path/to/script.log 2>&1

3. निष्पादित कमांड का उपयोग करके प्रक्रिया के चरणों का निर्माण

आप शेल स्क्रिप्ट का एक सेट बनाने के लिए निष्पादन कमांड का उपयोग भी कर सकते हैं जो प्रक्रिया के चरणों की तरह क्रमिक रूप से एक दूसरे को निष्पादित करते हैं। हर बार नई प्रक्रियाओं को पैदा करने के बजाय, आपको नियंत्रण को अगली स्क्रिप्ट पर स्थानांतरित करने की आवश्यकता होती है जिसे आप निष्पादित कमांड निष्पादित करते हैं।

इस स्थिति में प्रत्येक चरण का अंतिम कथन execकमांड होना चाहिए जो अगले चरण को लागू करता है।

अधिक के लिए शेल स्क्रिप्ट में कमांड का उपयोगexec देखें ।

नोट: ऊपर का भाग इसी से लिया गया है


1
केवल पूर्ण उत्तर (अब तक)।
heemayl

हर समय मैंने निष्पादन का उपयोग दक्षता के लिए किया है। यदि आप निष्पादन के साथ एक डेमॉन चलाते हैं तो आपको केवल दो के बजाय एक सक्रिय प्रक्रिया की आवश्यकता होती है। अन्य चीजों के अलावा, बाश की एमबी के एक जोड़े को बर्बाद करने की प्रक्रिया को छोड़कर।
1

2

जहाँ तक मुझे पता है कि इसका उपयोग बैश-स्क्रिप्ट के फ़ाइल डिस्क्रिप्टर (उदाहरण के लिए, STDOUT, STDERR, STDIN) के लिए किया जाता है।

इसलिए, उदाहरण के लिए, आप STDIN पुनर्निर्देशन का उपयोग करके कीबोर्ड के बजाय एक फ़ाइल से पढ़ सकते हैं और STDOUT द्वारा टर्मिनल के बजाय एक फ़ाइल पर लिख सकते हैं (या प्रोग्राम के आधार पर STDERR हो सकता है) पुनर्निर्देशन।


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