যেহেতু ফাইলটি কোনও প্রকারের এক্সিকিউটেবল সিস্টেমের দ্বারা স্বীকৃত নয়, এবং ধরে নিই যে আপনি এই ফাইলটি সম্পাদন করার অনুমতি পেয়েছেন, তাই 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"