যেহেতু ফাইলটি কোনও প্রকারের এক্সিকিউটেবল সিস্টেমের দ্বারা স্বীকৃত নয়, এবং ধরে নিই যে আপনি এই ফাইলটি সম্পাদন করার অনুমতি পেয়েছেন, তাই execve()
সিস্টেম কলটি সাধারণত একটি ENOEXEC
( কার্যকরযোগ্য নয় ) ত্রুটির সাথে ব্যর্থ হবে ।
এরপরে যা ঘটে তা হ'ল কমান্ডটি কার্যকর করতে ব্যবহৃত অ্যাপ্লিকেশন এবং / অথবা লাইব্রেরি ফাংশন to
এটি উদাহরণস্বরূপ শেল, execlp()
/ execvp()
libc ফাংশন হতে পারে।
কমান্ড চালানোর সময় বেশিরভাগ অন্যান্য অ্যাপ্লিকেশন সেগুলির মধ্যে দুটিই ব্যবহার করবে। তারা system("command line")
libc ফাংশনের মাধ্যমে উদাহরণস্বরূপ একটি শাঁস আহ্বান করবে যা সাধারণত sh
কমান্ড লাইনটি পার্স করার জন্য আহ্বান জানায় (যার পথটি সংকলন সময়ে নির্ধারণ করা যায় ( সোলারিসের মতো /bin/sh
বনাম /usr/xpg4/bin/sh
)), বা $SHELL
নিজের দ্বারা সঞ্চিত শেলটি অনুরোধ করবে vi
এটির !
কমান্ড সহ, বা আরও xterm -e 'command line'
অনেকগুলি কমান্ড ( su user -c
ব্যবহারকারীর লগইন শেলটির পরিবর্তে অনুরোধ করবে $SHELL
)।
সাধারণত, একটি শেবাং-কম পাঠ্য ফাইল যা শুরু হয় না #
এটি একটি sh
স্ক্রিপ্ট হিসাবে বিবেচনা করা হয় । যা sh
এটি হ'ল তবে তারতম্য হবে।
execlp()
/ execvp()
, execve()
ফিরে আসার পরে এটি ENOEXEC
সাধারণত অনুরোধ sh
করবে। যেসব সিস্টেমে একের অধিক sh
সংস্থাগুলি রয়েছে কারণ তারা একাধিক মান মেনে চলতে পারে, যা sh
সাধারণত এটি সংকলনের সময় নির্ধারিত হবে (অ্যাপ্লিকেশনটি কোডের একটি ভিন্ন ব্লবকে ব্যবহার করে execvp()
/ execlp()
যা একটি পৃথক পথ নির্দেশ করে sh
)) উদাহরণস্বরূপ, সোলারিসে, এটি হয় /usr/xpg4/bin/sh
(একটি স্ট্যান্ডার্ড, পসিক্স sh
) বা /bin/sh
(সোলারিস 10 এবং তার চেয়ে পুরনো বোর্ন শেল (একটি প্রাচীন শেল), সোলারিস 11 এ ksh93) হবে।
এটি শাঁসের ক্ষেত্রে যখন আসে তখন প্রচুর তারতম্য হয়। bash
, এটিএন্ডটি ksh
, বোর্ন শেল সাধারণত স্ক্রিপ্টটি ব্যাখ্যা করবে (একটি শিশু প্রক্রিয়ায় exec
ব্যবহৃত না হওয়া পর্যন্ত ) একটি সিমুলেট করার পরে execve()
, যা সমস্ত অপরিবর্তিত ভেরিয়েবলগুলি আনসেট করা হয়, সমস্ত অন-এক্সিকিউট এফডি বন্ধ করে দেয়, সমস্ত কাস্টম ট্র্যাপগুলি সরিয়ে দেয়, উপকরণ, ফাংশন ... ( bash
স্ক্রিপ্টটি sh
মোডে ব্যাখ্যা করবে )। yash
নিজেই চালানো হবে (সঙ্গে sh
যেমন argv[0]
তাই sh
এটা ব্যাখ্যা করা মোড)।
zsh
, pdksh
, ash
ভিত্তিক শেল সাধারণত ডাকা হবে sh
(পথ সংকলন সময়ে যার নির্ধারিত)।
জন্য csh
এবং tcsh
(এবং sh
কিছু গোড়ার দিকে BSD গুলোর এর), যদি ফাইলের প্রথম চরিত্র #
, তারপর তারা নিজেদের এটা ব্যাখ্যা করা, এবং চালানো হবে sh
অন্যথায়। এটি পূর্ব-শেবাং সময়ে ফিরে যায় যেখানে মন্তব্য হিসাবে csh
স্বীকৃতি পেল #
কিন্তু বোর্ন শেল নয়, সুতরাং #
এটি একটি সিএস স্ক্রিপ্ট ছিল এমন ইঙ্গিত ছিল।
fish
(কমপক্ষে সংস্করণ ২.৪.০), execve()
ব্যর্থ হলে কেবল একটি ত্রুটি প্রদান করে (এটি এটি কোনও স্ক্রিপ্ট হিসাবে বিবেচনা করার চেষ্টা করে না)।
কিছু শেল (যেমন bash
বা এটিএন্ডটি ksh
) ফাইলটি সম্ভবত স্ক্রিপ্ট হিসাবে বোঝানো হয়েছে কিনা তা প্রথমে তাত্পর্যপূর্ণভাবে নির্ধারণ করার চেষ্টা করবে। সুতরাং আপনি দেখতে পাবেন যে কয়েকটি শেল কোনও স্ক্রিপ্ট কার্যকর করতে অস্বীকার করবে যদি এটি প্রথম কয়েকটি বাইটে কোনও NUL চরিত্র পায়।
এছাড়াও মনে রাখবেন যে execve()
ENOEXEC এ ব্যর্থ হয়ে থাকলেও ফাইলটিতে একটি শেবাং লাইন থাকে তবে কিছু শেল সেগুলি শেবাং লাইনকে নিজেরাই ব্যাখ্যা করার চেষ্টা করে।
সুতরাং কয়েকটি উদাহরণ:
- যখন
$SHELL
হয় /bin/bash
, xterm -e 'myscript with args'
হবে myscript
ব্যাখ্যা bash
মধ্যে sh
মোড। সঙ্গে যদিও xterm -e myscript with args
, xterm
ব্যবহার করবে execvp()
, যাতে স্ক্রিপ্ট দ্বারা ব্যাখ্যা করা হবে sh
।
su -c myscript
সোলারিস 10 এ যেখানে root
লগইন শেলটি /bin/sh
এবং /bin/sh
বোর্ন শেলটি বোর্ন শেল myscript
দ্বারা ব্যাখ্যা করা হবে ।
/usr/xpg4/bin/awk 'BEGIN{system("myscript")'
সোলারিস 10 এ এটির দ্বারা ব্যাখ্যা করা হবে /usr/xpg4/bin/sh
(একই জন্য /usr/xpg4/bin/env myscript
)।
find . -prune -exec myscript {} \;
সোলারিস 10 তে (ব্যবহার করে execvp()
) এটির /bin/sh
সাথে /usr/xpg4/bin/find
এমনকি পসিক্স পরিবেশে (একটি কনফরমেশন বাগ) ব্যাখ্যাও করবে।
csh -c myscript
অন্যথায় , csh
এটি দিয়ে শুরু হলে এটি দ্বারা ব্যাখ্যা করা হবে ।#
sh
সব মিলিয়ে আপনি নিশ্চিত হতে পারবেন না যে কীভাবে এবং কীভাবে এটি চাওয়া হবে তা যদি আপনি না জানেন তবে সেই স্ক্রিপ্টটির ব্যাখ্যার জন্য কোন শেল ব্যবহার করা হবে।
যাইহোক , read -p
কেবলমাত্র bash
সিনট্যাক্স, সুতরাং আপনি নিশ্চিত করতে চাইবেন যে স্ক্রিপ্টটি ব্যাখ্যা করেছে bash
(এবং সেই বিভ্রান্তিমূলক .sh
এক্সটেনশন এড়াতে )। হয় আপনি কার্যকর bash
এবং ব্যবহারের পথ জানেন :
#! /path/to/bash -
read -p ...
অথবা আপনি $PATH
ব্যবহার করে bash
এক্সিকিউটেবল (ধরে নিচ্ছেন bash
ইনস্টল করা) এর একটি দৃশ্যের উপর নির্ভর করতে এবং ব্যবহার করতে পারেন:
#! /usr/bin/env bash
read -p ...
( env
প্রায় সর্বব্যাপী পাওয়া যায় /usr/bin
)। বিকল্পভাবে, আপনি এটিকে পসিক্স + বোর্ন সামঞ্জস্য করতে পারেন যা আপনি ব্যবহার করতে পারেন /bin/sh
। সমস্ত সিস্টেমে ক /bin/sh
। তাদের বেশিরভাগের ক্ষেত্রে এটি (বেশিরভাগ অংশের) পসিক্স-সামঞ্জস্যপূর্ণ হবে তবে আপনি তারপরে এখনও এবং তারপরে একটি বোর্ন শেলটি খুঁজে পেতে পারেন।
#! /bin/sh -
printf >&2 'Enter a user name: '
read user
printf '%s\n' "$user"