এক্সিকিউট কমান্ডের ব্যবহার কী সম্ভব?


10

আমি execকমান্ড শিখছি আমি জানি যে execকমান্ডটি যে প্রক্রিয়াটি শুরু করেছে তাকে প্রতিস্থাপন করে। সুতরাং যে প্রক্রিয়া execকমান্ড দ্বারা প্রতিস্থাপিত হয় ফিরে আসা সম্ভব নয় ।

কেউ বলতে পারেন যে এটির উদ্দেশ্যটি হল যে প্রক্রিয়াটি শুরু হয়েছিল তাতে ফিরে আসা অসম্ভব।

execকমান্ড হিসাবে উপলব্ধ কিছু আছে কি অন্যান্য ব্যবহারগুলি কি ?



1
উইকিপিডিয়া নিবন্ধ থেকে: "র্যাপার স্ক্রিপ্টগুলি পরিবেশ চলক বা অন্য কনফিগারেশন সেট করার পরে প্রোগ্রাম চালানোর জন্য প্রায়শই এই কমান্ডটি ব্যবহার করে (সরাসরি বা দোভাষী বা ভার্চুয়াল মেশিনের মাধ্যমে)"।
শে


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, stderrExec ব্যবহার করে ফাইলগুলি থেকে আপনাকে পুনঃনির্দেশিত করা যেতে পারে।

  1. পুনঃনির্দেশ stdout- বর্তমান শেল সেশনের শেষের জন্য exec 1>fileস্ট্যান্ডার্ড আউটপুটটিকে ফাইল fileহিসাবে চিহ্নিত করবে। ডিসপ্লেতে আউটপুট করার যে কোনও কিছুই ফাইলে থাকবে।

  2. পুনঃনির্দেশ stdin- এটি stdinকোনও ফাইলে পুনর্নির্দেশের জন্যও ব্যবহার করা যেতে পারে । উদাহরণস্বরূপ, আপনি যদি কোনও স্ক্রিপ্ট ফাইল সম্পাদন করতে চান তবে আপনি script.shকেবলমাত্র stdinব্যবহার করে ফাইলটিতে পুনর্নির্দেশ করতে পারেন exec 0<script.sh


ঠিক আছে. এরপরে 'সাথী-টার্মিনাল'-এর পিআইডি র‌্যাপার-স্ক্রিপ্টের পিআইডি থাকবে? এবং মোড়ক-স্ক্রিপ্ট ব্যবহৃত মেমরি ব্যবহার করবে? সুতরাং মোড়ক-স্ক্রিপ্টটি নিখোঁজ হয়েছে। অন্যথায় দুটি স্ক্রিপ্ট সিস্টেমের পৃথক প্রক্রিয়া হিসাবে উপস্থিত হবে (দুটি পৃথক পিআইডি সহ)?
মিজেক

@ মিজেচ হ্যাঁ তারা একই পিআইডি ব্যবহার করে
আনোয়ার

এটি জানতে সাহায্য করে @ মিজাচ খুশি :)
আনোয়ার

1
দুর্দান্ত উদাহরণ, এটি এটি সত্যই স্পষ্ট করে তোলে
জান্না

এই উত্তরটি আংশিক এবং এর একটি গুরুত্বপূর্ণ (এবং সাধারণ) ব্যবহারগুলি মিস execকরে যা এটি ফাইল বর্ণনাকারীদের পুনঃনির্দেশে ব্যবহার করে।
হিমাইল

9

exec কমান্ডটি বর্তমান শেল প্রক্রিয়াটিকে নির্দিষ্ট কমান্ড দ্বারা প্রতিস্থাপন করে। সাধারণত, আপনি যখন কোনও কমান্ড চালান তখন একটি নতুন প্রক্রিয়া তৈরি হয় (কাঁটাচামচ)। exec কমান্ড নতুন পদ্ধতির ডিম নেই। পরিবর্তে, বর্তমান প্রক্রিয়াটি নতুন কমান্ড দ্বারা আবৃত রয়েছে। অন্য কথায় execকমান্ডটি একটি নতুন প্রক্রিয়া তৈরি না করে বর্তমান শেলের পরিবর্তে কার্যকর করা হয়।

এক্সিকিউট কমান্ডের তিনটি সাধারণ ব্যবহার রয়েছে:

1. প্রক্রিয়া প্রতিস্থাপন

উদাহরণ -১: আপনি যদি নতুনbashশেলটিখুলেন তবে

$ bash 

মধ্যে pstreeএটা দেখে মনে হচ্ছে

├─gnome-টার্মিনাল
        ├─bash───bash───pstree

আগের bashশেলটি এখনও আছে এবং আপনি একটি নতুন bashশেল পেয়েছেন । আপনি যদি নতুন কোনও বাশ শেল হিসাবে খোলেন,

$ exec bash

pstreeশো

├─gnome-টার্মিনাল
        ├─bash───pstree

এখানে bashপুরানোটি নতুন দিয়ে প্রতিস্থাপন করা হয়েছে। এক কমান্ডে একাধিক লগইন থেকে বেরিয়ে আসা বিশেষত কার্যকর। এটি আরও সুরক্ষিত এবং ভুল করে একটি উন্মুক্ত টার্মিনাল রেখে যাওয়ার সম্ভাবনাটি নির্মূল করে। দেখুন এক আদেশের সঙ্গে উভয় রুট এবং ব্যবহারকারীর কাছ থেকে প্রস্থান করুন

উদাহরণ -২: আপনি যেমন ফাইল খুলতে পারেন

$ exec vi filename.txt

আপনি যখন প্রস্থান করবেন তখন viশেলটি ইতিমধ্যে প্রতিস্থাপন করা হওয়ায় আলাদাভাবে টার্মিনালটি বন্ধ করার দরকার নেই। ভিআই বন্ধ করার সাথে সাথে টার্মিনালটিও বন্ধ হয়ে যায়।

২. শেল স্ক্রিপ্টগুলির মধ্যে ফাইল বর্ণনাকারীদের পুনঃনির্দেশের একটি পদ্ধতি

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

৩. এক্সিকিউট কমান্ড ব্যবহার করে প্রক্রিয়াটির স্তর তৈরি করা stages

আপনি শেক স্ক্রিপ্টগুলির একটি সেট তৈরি করতে এক্সিকিউট কমান্ডটি ব্যবহার করতে পারেন যা প্রক্রিয়াটির পর্যায়ে যেমন একে অপরকে ক্রমান্বয়ে কার্যকর করে। প্রতিবার নতুন প্রসেস তৈরি করার পরিবর্তে আপনি এক্সিকিউট কমান্ডটি কার্যকর করে পরবর্তী স্ক্রিপ্টে নিয়ন্ত্রণ স্থানান্তর করতে হবে।

এক্ষেত্রে প্রতিটি স্তরের শেষ বিবৃতিটি execহ'ল কমান্ড হওয়া উচিত যা পরবর্তী পর্যায়ে চলে।

দেখুন ব্যবহার execশেল স্ক্রিপ্ট-এ কমান্ড আরো অনেক কিছুর জন্য।

দ্রষ্টব্য: উপরের অংশটি এ থেকে নেওয়া হয়েছে


1
কেবলমাত্র সম্পূর্ণ উত্তর (এখনও অবধি)।
হিমাইল

আমি যতবার এক্সিকিউট ব্যবহার করেছি সেগুলি দক্ষতার জন্য ছিল। আপনি যদি এক্সিকিউটিউটের সাথে ডেমন চালান তবে আপনার কেবল দুটি পরিবর্তে একটি সক্রিয় প্রক্রিয়া থাকা দরকার। বাশ প্রক্রিয়াটিকে চারপাশে ফেলে রেখে অন্যান্য জিনিসগুলির মধ্যে কয়েক মিলিয়ন এমএম র‌্যাম নষ্ট করে দেয়।
gmatht

2

যতদূর আমি জানি এটি কোনও ব্যাশ-স্ক্রিপ্টের ফাইল বর্ণনাকারী (উদাহরণস্বরূপ, STDOUT, STDERR, STDIN) পুনঃনির্দেশ করতে ব্যবহৃত হয়।

উদাহরণস্বরূপ, আপনি STDIN পুনর্নির্দেশটি ব্যবহার করে কীবোর্ডের পরিবর্তে কোনও ফাইল থেকে পড়তে পারেন এবং STDOUT (বা প্রোগ্রামের উপর নির্ভর করে STDERR হতে পারে) পুনর্নির্দেশের মাধ্যমে টার্মিনালের পরিবর্তে কোনও ফাইলটিতে লিখতে পারেন।


1
এই উত্তরটি আংশিক এবং কেবল এই উত্তরটির পরিপূরক ।
হিমাইল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.