একটি "exec" কমান্ড কী করে?


108

আমি বাশ কমান্ড বুঝতে পারি না exec। আমি দেখেছি এটা ভিতরে স্ক্রিপ্ট ব্যবহৃত (যেমন দেখা একটি ফাইলে সব আউটপুট পুনর্নির্দেশ করতে এই )। তবে এটি কীভাবে কাজ করে বা সাধারণভাবে এটি কী করে তা আমি বুঝতে পারি না। আমি ম্যান পেজগুলি পড়েছি কিন্তু সেগুলি বুঝতে পারি না।


কোন প্রক্রিয়াটি কি আপনি তার সাথে পরিচিত ?
fkraiem

1
@fkraiem আপনার মানে কি?
বেকো

দুঃখিত আমি "কি" বলতে চাইছিলাম। : p তবে উত্তরটি না বলে মনে হচ্ছে।
fkraiem

তবে আসলে আপনার লিপিটি execএকটি বিশেষ উপায়ে ব্যবহার করে যা আরও সহজভাবে ব্যাখ্যা করা যেতে পারে, আমি একটি উত্তর লিখব।
fkraiem

উত্তর:


88

man bash বলেছেন:

exec [-cl] [-a name] [command [arguments]]
      If command is specified, it replaces the shell.  No new  process
      is  created.  The arguments become the arguments to command.  If
      the -l option is supplied,  the  shell  places  a  dash  at  the
      beginning  of  the  zeroth  argument passed to command.  This is
      what login(1) does.  The -c option causes command to be executed
      with  an empty environment.  If -a is supplied, the shell passes
      name as the zeroth argument to the executed command.  If command
      cannot  be  executed  for  some  reason, a non-interactive shell
      exits, unless the execfail shell option  is  enabled.   In  that
      case,  it returns failure.  An interactive shell returns failure
      if the file cannot be executed.  If command  is  not  specified,
      any  redirections  take  effect  in  the  current shell, and the
      return status is 0.  If there is a redirection error, the return
      status is 1.

শেষ দুটি লাইন যা গুরুত্বপূর্ণ তা: আপনি যদি execকমান্ড ব্যতীত নিজেই চালান , এটি কেবল বর্তমান শেলটিতে পুনর্নির্দেশগুলি প্রযোজ্য করে তুলবে। আপনি সম্ভবত জানেন যে আপনি যখন রান করবেন command > fileতখন আউটপুটটি আপনার টার্মিনালের পরিবর্তে commandলেখা হয় file(এটিকে পুনঃনির্দেশ বলা হয় )। আপনি যদি এর exec > fileপরিবর্তে চালনা করেন তবে পুনঃনির্দেশটি পুরো শেলের সাথে প্রযোজ্য: শেল দ্বারা উত্পাদিত যে কোনও আউটপুট fileআপনার টার্মিনালের পরিবর্তে লিখিত হয় । উদাহরণস্বরূপ এখানে

bash-3.2$ bash
bash-3.2$ exec > file
bash-3.2$ date
bash-3.2$ exit
bash-3.2$ cat file
Thu 18 Sep 2014 23:56:25 CEST

আমি প্রথমে একটি নতুন bashশেল শুরু করি । তারপরে, এই নতুন শেলটিতে আমি চালাচ্ছি exec > file, যাতে সমস্ত আউটপুট পুনঃনির্দেশিত হয় file। প্রকৃতপক্ষে, এর পরে আমি চালনা করি dateতবে আমি কোনও আউটপুট পাই না, কারণ আউটপুটটি পুনঃনির্দেশিত হয় file। তারপরে আমি আমার শেলটি প্রস্থান করলাম (যাতে পুনর্নির্দেশটি আর প্রযোজ্য না হয়) এবং আমি দেখতে পাচ্ছি যে আমি কমান্ডটি আগে fileচালিয়েছি containsdate


42
এটি কেবল আংশিক ব্যাখ্যা। execবর্তমান শেল প্রক্রিয়াটি একটি কমান্ডের সাথে প্রতিস্থাপনের জন্যও কাজ করে, যাতে পিতামাতারা একদিকে যায় এবং শিশু পিডের মালিক হয়। এটি কেবল পুনঃনির্দেশের জন্য নয়। দয়া করে এই তথ্যটি যুক্ত করুন
সের্গেই কোলোডিযজনি

3
@ সের্গি কলোডিএজহ্নির মন্তব্য অনুসরণ করে, আমি এই পৃষ্ঠাটিতে আমার নেতৃত্বদানের জন্য যে উদাহরণটির মুখোমুখি হয়েছিলাম তা হ'ল ডকার-এন্ট্রিপয়েন্ট.শ, যেখানে এনজিনেক্স কনফিগারেশনে বিভিন্ন ক্রিয়া সম্পাদনের পরে, স্ক্রিপ্টের চূড়ান্ত লাইনটি exec nginx <various nginx arguments>। এর অর্থ হ'ল এনগিনেক্স বাশ স্ক্রিপ্টের পিড নিয়ে যায় এবং এখন এনজিনেক্স হ'ল স্ক্রিপ্ট নয়, ধারকটির মূল চলমান প্রক্রিয়া। আমি ধরে নিলাম এটি কেবল পরিষ্কার-পরিচ্ছন্নতার জন্যই, যদি না অন্য কারও পক্ষে এর জন্য আরও দৃ concrete় কারণ না জানা থাকে?
লুক গ্রিফিথস

1
@ লুক এটিকে "র‍্যাপার স্ক্রিপ্ট" বলা হয়। এর gnome-terminalউদাহরণটিও হ'ল , যা কমপক্ষে 14.04 এ আর্গুমেন্ট সেট আপ করার জন্য একটি র‍্যাপার স্ক্রিপ্ট ছিল। এবং এটি তাদের একমাত্র উদ্দেশ্য, সত্য - শিল্প ও পরিবেশ নির্ধারণ করুন। আরেকটি কেস পরিষ্কার করা হবে - প্রথমে একটি প্রক্রিয়াটির পূর্ববর্তী ঘটনাটি মেরে
ফেলুন

অন্য execঅনুরূপ উদাহরণ nginx@LukeGriffiths কর্তৃক প্রদত্ত উদাহরণ ~/.vnc/xstartupস্ক্রিপ্ট vncserverVNC সার্ভার প্রক্রিয়া এবং তারপর কনফিগার করতে ব্যবহার exec gnome-sessionবা exec startkdeইত্যাদি।
ট্রেভর বয়েড স্মিথ

@ লুকগ্রিফিথস, execএকটি ধারক স্টার্টআপ স্ক্রিপ্টের মূল কারণ হ'ল ডকারের মধ্যে কনটেইনারটির ENTRYPOINT, পিআইডি 1 এর একটি বিশেষ তাত্পর্য রয়েছে। এটি একটি প্রধান প্রক্রিয়া যা সংকেত গ্রহণ করে এবং যখন এটি উপস্থিত থাকে, ধারকটিও খুব বাইরে চলে যায়। কমান্ডের এই চেইন থেকে বেরিয়ে আসার execএকটি উপায় shএবং ডিমনটিকে কনটেইনারটির প্রধান প্রক্রিয়া হিসাবে তৈরি করুন।
kkm

46

exec দুটি স্বতন্ত্র আচরণের সাথে একটি আদেশ, এটির সাথে কমপক্ষে একটি যুক্তি ব্যবহৃত হয়, বা কোনও যুক্তি মোটেই ব্যবহৃত হয় না তার উপর নির্ভর করে।

  • যদি কমপক্ষে একটি যুক্তি পাস করা হয়, তবে প্রথমটি একটি কমান্ডের নাম হিসাবে নেওয়া execহবে এবং অবশিষ্ট আর্গুমেন্টগুলি যদি কোনও কমান্ডের কাছে পাঠানো হয় এবং কমান্ড হিসাবে পুনর্নির্দেশগুলি পরিচালনা করে, তবে এটি একটি কমান্ড হিসাবে কার্যকর করার চেষ্টা করুন।

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

  • যদি কমান্ডটি উপস্থিত থাকে এবং কার্যকর হয় তবে এটি বর্তমান শেলটি প্রতিস্থাপন করে। এর অর্থ হ'ল যদি execকোনও স্ক্রিপ্টে উপস্থিত হয়, এক্সিকিউটিভ কল অনুসরণ করার নির্দেশাবলী কখনই কার্যকর করা হবে না (যদি না execসে নিজেই সাবসিলে থাকে)। execকখনই ফিরে আসে না। "EXIT" এর মতো শেল ফাঁদগুলি আর ট্রিগার হবে না।

  • যদি কোনও যুক্তি পাস না করা execহয় তবে কেবলমাত্র বর্তমান শেল ফাইল বর্ণনাকারী পুনরায় সংজ্ঞায়িত করতে ব্যবহৃত হয়। শেলটি execপূর্বের কেসগুলির মতো নয় পরে চলতে থাকে তবে স্ট্যান্ডার্ড ইনপুট, আউটপুট, ত্রুটি বা যে কোনও ফাইল বিবরণী পুনঃনির্দেশিত হয়েছে কার্যকর হবে।

  • যদি কিছু পুনঃনির্দেশগুলি ব্যবহার করে তবে এর থেকে যে /dev/nullকোনও ইনপুট ইওএফ ফিরিয়ে দেবে এবং এতে কোনও আউটপুট বাতিল করা হবে।

  • আপনি -উত্স বা গন্তব্য হিসাবে উদাহরণস্বরূপ ব্যবহার করে ফাইল বর্ণনাকারী বন্ধ করতে পারেন exec <&-। পরবর্তীকালে পড়া বা লেখাগুলি ব্যর্থ হবে।

এখানে দুটি উদাহরণ দেওয়া হল:

echo foo > /tmp/bar
exec < /tmp/bar # exec has no arguments, will only affect current shell descriptors, here stdin
cat # simple command that read stdin and write it to stdout

এই স্ক্রিপ্টটি "foo" কে ক্যাট কমান্ড হিসাবে আউটপুট দেবে, ব্যবহারকারীর ইনপুটটির জন্য অপেক্ষা না করে যেমনটি সাধারন ক্ষেত্রে করা হত তার ইনপুটটি / tmp / বার ফাইল থেকে গ্রহণ করবে যার মধ্যে foo রয়েছে।

echo foo > /tmp/bar
exec wc -c < /tmp/bar # exec has two arguments, the control flow will switch to the wc command
cat

এই স্ক্রিপ্টটি প্রদর্শিত হবে 4(/ টিএমপি / বারে বাইটের সংখ্যা) এবং অবিলম্বে শেষ হবে। catকমান্ড নির্বাহ করা হবে না।


4
`কিছু পুরানো পোস্ট আসলেই পুরানো হয় না ... +1।
সিবিহে

3
যদি কিছু পুনঃনির্দেশগুলি / dev / নাল ব্যবহার করে তবে সম্পর্কিত ফাইল বর্ণনাকারী বন্ধ হয়ে যায়। না, এটি সত্যই / থেকে পুনঃনির্দেশ করে না /dev/null, তাই লেখার পরেও সফল হয় এবং রিটার্ন ইওএফ পড়ে। close(2)একটি এফডি তে রিড / রাইটিং সিস্টেমের কলগুলি ত্রুটিগুলি ফিরিয়ে আনতে পারে এবং exec 2>&-উদাহরণস্বরূপ আপনি এটি করেন।
পিটার কর্ডেস

2
এটি নিজেই চেষ্টা করে দেখুন exec 3</dev/null; ls -l /proc/self/fd: নোট করুন যে fd 3 কেবলমাত্র / ডিভ / নাল উপর পঠনযোগ্য হবে। তারপরে এটি আবার বন্ধ করুন exec 3<&-এবং আপনি দেখতে পারবেন ( ls -l /proc/$$/fdআবারও) আপনার শেল প্রক্রিয়াটির আর কোনও এফডি 3 নেই। (স্টিডিনটি বন্ধ exec <&-করে স্ক্রিপ্টগুলিতে দরকারী হতে পারে তবে ইন্টারেক্টিভভাবে এটি একটি লগআউট হয়))
পিটার

@ পিটারকর্ডস আপনি একেবারে ঠিক বলেছেন উত্তর আপডেট হয়েছে। ধন্যবাদ!
jlliagre

1
এই উত্তরটি দুর্দান্ত কারণ এটি বর্তমানের সর্বাধিক উত্সাহিত উত্তরগুলির দুটি ব্যবহারের ক্ষেত্রে ব্যাখ্যা execকরে কেবল একটি ব্যবহারের ক্ষেত্রে এবং অন্য উত্তরটি জি_পি দ্বারা কেবল অন্য ব্যবহারের ক্ষেত্রে আলোচনা করে। এবং এই উত্তরটি এই জাতীয় জটিল বিষয়গুলির জন্য সুন্দর এবং সংক্ষিপ্ত / পঠনযোগ্য।
ট্রেভর বয়ড স্মিথ

33

বুঝতে হলে execআপনাকে প্রথমে বুঝতে হবে fork। আমি এটি সংক্ষিপ্ত রাখার চেষ্টা করছি।

  • আপনি যখন রাস্তায় কাঁটাচামচ করতে আসেন আপনার কাছে সাধারণত দুটি বিকল্প থাকে। লিনাক্স প্রোগ্রামগুলি যখন কোনও fork()কল আসে তখন তারা রাস্তায় এই কাঁটাচামচ পৌঁছে ।

  • সাধারণ প্রোগ্রামগুলি হ'ল সিস্টেম কমান্ড যা আপনার সিস্টেমে একটি সংকলিত আকারে বিদ্যমান। যখন এই জাতীয় প্রোগ্রাম কার্যকর করা হয় তখন একটি নতুন প্রক্রিয়া তৈরি হয়। এই শিশু প্রক্রিয়াটির পিতামাতার মতোই পরিবেশ রয়েছে, কেবল প্রক্রিয়া আইডি নম্বরটি আলাদা। এই পদ্ধতিটি ফোরিং বলা হয় ।

  • ফোর্কিং একটি বিদ্যমান প্রক্রিয়াটিকে নতুন করে শুরু করার জন্য একটি উপায় সরবরাহ করে। যাইহোক, এমন পরিস্থিতিতে থাকতে পারে যেখানে কোনও শিশু প্রক্রিয়া পিতামাতার প্রক্রিয়া হিসাবে একই প্রোগ্রামের অংশ না হয়। এই ক্ষেত্রে execব্যবহৃত হয়। exec একটি প্রোগ্রাম বাইনারি থেকে তথ্য সহ বর্তমানে চলমান প্রক্রিয়া বিষয়বস্তু প্রতিস্থাপন করা হবে।
  • কৌতুক প্রক্রিয়াটির পরে, শিশু প্রক্রিয়াটির ঠিকানা স্থানটি নতুন প্রক্রিয়া ডেটার সাথে ওভাররাইট করা হয়। এটি সিস্টেমে একটি এক্সিকিউটিভ কলের মাধ্যমে করা হয়।

3
execআমি যে লিঙ্কটি পোস্ট করেছি তার মতো আপনিও কেন কোনও স্ক্রিপ্ট আউটপুট পুনর্নির্দেশ করতে পারেন তা ব্যাখ্যা করতে পারেন?
বেকো

1
আমি এই অস্পষ্টটি খুঁজে পেয়েছি "তবে, এমন পরিস্থিতিতে থাকতে পারে যেখানে কোনও শিশু প্রক্রিয়া পিতামাতার প্রক্রিয়া হিসাবে একই প্রোগ্রামের অংশ না হয়"
সিডোসোর্ন

6

ইন bash, আপনি যদি help exec:

$ help exec
exec: exec [-cl] [-a name] [command [arguments ...]] [redirection ...]
    Replace the shell with the given command.

    Execute COMMAND, replacing this shell with the specified program.
    ARGUMENTS become the arguments to COMMAND.  If COMMAND is not specified,
    any redirections take effect in the current shell.

    Options:
      -a name   pass NAME as the zeroth argument to COMMAND
      -c        execute COMMAND with an empty environment
      -l        place a dash in the zeroth argument to COMMAND

    If the command cannot be executed, a non-interactive shell exits, unless
    the shell option `execfail' is set.

    Exit Status:
    Returns success unless COMMAND is not found or a redirection error occurs.

প্রাসঙ্গিক বিট:

If COMMAND is not specified, any redirections take effect in the current shell.

execএটি একটি শেল বিল্টিন , যা জিএপি বলেছে এমন সিস্টেম কলগুলিরexec পরিবারের শেলের সমতুল্য (এবং যার ম্যানাপগুলি আপনি পড়েছেন বলে মনে হয়)। কোনও কমান্ড সুনির্দিষ্ট না করা থাকলে এটিতে বর্তমান শেলকে প্রভাবিত করার পসআইএক্সের বাধ্যতামূলক কার্যকারিতা রয়েছে।

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