একটি শেল অপারেটিং সিস্টেমের জন্য একটি ইন্টারফেস। এটি সাধারণত তার নিজের মধ্যে আরও কম-বেশি শক্তসমর্থ প্রোগ্রামিং ভাষা হয় তবে বিশেষত অপারেটিং সিস্টেম এবং ফাইল সিস্টেমের সাথে ইন্টারঅ্যাক্ট করা সহজ করার জন্য ডিজাইন করা বৈশিষ্ট্যগুলির সাথে। পসিক্স শেলের (পরবর্তীকালে "শেল" হিসাবে উল্লেখ করা হয়েছে) শব্দার্থবিজ্ঞানগুলি একটি মিট হিসাবে কিছুটা থাকে, LISP এর কয়েকটি বৈশিষ্ট্যগুলির সংমিশ্রণ (s- এক্সপ্রেশনগুলির শেল শব্দের বিভাজনের সাথে অনেকগুলি মিল রয়েছে ) এবং সি (শেলের অনেকগুলি গাণিতিক বাক্য গঠন) শব্দার্থবিজ্ঞান সি থেকে আসে)।
শেলের সিনট্যাক্সের অন্য মূলটি পৃথক ইউনিক্স ইউটিলিটিগুলির একটি ম্যাসম্যাশ হিসাবে তার লালন থেকে আসে। শেলের মধ্যে প্রায়শই অন্তর্নির্মিত বেশিরভাগগুলি বাস্তবে বাহ্যিক কমান্ড হিসাবে প্রয়োগ করা যেতে পারে। এটি লুপের জন্য অনেকগুলি শেল নিওফাইট নিক্ষেপ করে যখন তারা বুঝতে পারে যে /bin/[
অনেক সিস্টেমে বিদ্যমান।
$ if '/bin/[' -f '/bin/['; then echo t; fi
t
ওয়াট?
শেল কীভাবে প্রয়োগ করা হয় তা যদি আপনি লক্ষ্য করেন তবে এটি আরও অনেক বেশি অর্থবোধ করে। এখানে একটি প্রয়োগ হিসাবে আমি অনুশীলন হিসাবে করেছি। এটি পাইথনে রয়েছে, তবে আমি আশা করি এটি কারও জন্য হ্যাঙ্গআপ নয়। এটি মারাত্মক শক্তিশালী নয়, তবে এটি শিক্ষণীয়:
#!/usr/bin/env python
from __future__ import print_function
import os, sys
'''Hacky barebones shell.'''
try:
input=raw_input
except NameError:
pass
def main():
while True:
cmd = input('prompt> ')
args = cmd.split()
if not args:
continue
cpid = os.fork()
if cpid == 0:
os.execl(args[0], *args)
else:
os.waitpid(cpid, 0)
if __name__ == '__main__':
main()
আমি আশা করি উপরেরটি এটি পরিষ্কার করে দিয়েছে যে শেলের এক্সিকিউশন মডেলটি অনেক বেশি:
1. Expand words.
2. Assume the first word is a command.
3. Execute that command with the following words as arguments.
সম্প্রসারণ, আদেশের সমাধান, কার্যকর করা execution শেলটির সমস্ত শব্দার্থবিজ্ঞান এই তিনটি জিনিসের একটিতে আবদ্ধ, যদিও আমি উপরে লিখেছি বাস্তবায়নের চেয়ে সেগুলি অনেক বেশি সমৃদ্ধ।
সমস্ত আদেশ না fork
। প্রকৃতপক্ষে, কয়েকটি মুখ্য কমান্ড রয়েছে যা বহিরাগত হিসাবে প্রয়োগ করা এক টন অর্থে তৈরি করে না (যেমন তাদের করতে হবে fork
), তবে এমনকি এগুলি প্রায়শই কঠোর পসিক্স সম্মতির জন্য বহিরাগত হিসাবে উপলব্ধ।
পশিক শেলটি বাড়ানোর জন্য নতুন বৈশিষ্ট্য এবং কীওয়ার্ড যুক্ত করে ব্যাশ এই ভিত্তিতে তৈরি করে। এটি sh এর সাথে প্রায় উপযুক্ত। (আমি আরও আশ্চর্য হই যে লোকেরা কীভাবে একটি প্রোগ্রামিং ভাষার শব্দার্থবিজ্ঞান এবং শৈলীর বিষয়ে এত যত্ন করতে পারে এবং শেলের শব্দার্থকতা এবং শৈলীর জন্য খুব সামান্য, তবে আমি বিচ্ছিন্ন হয়ে পড়েছি।)
মূল্যায়নের আদেশ
এটি একটি কৌতূহলমূলক প্রশ্ন: বাশ তার প্রাথমিক বাক্য বাক্স থেকে বাম থেকে ডানদিকে এক্সপ্রেশন ব্যাখ্যা করে, তবে গাণিতিক বাক্য গঠনে এটি সি এর নজির অনুসরণ করে। প্রকাশ থেকে পৃথক প্রসারণও , যদিও। থেকে EXPANSION
ব্যাশ ম্যানুয়াল বিভাগে:
বিস্তারের ক্রম: ব্রেস সম্প্রসারণ; টিলডে সম্প্রসারণ, প্যারামিটার এবং পরিবর্তনশীল সম্প্রসারণ, পাটিগণিতের সম্প্রসারণ এবং কমান্ড প্রতিস্থাপন (বাম থেকে ডানদিকে ফ্যাশন); শব্দ বিভাজন; এবং পথের নাম সম্প্রসারণ।
আপনি যদি ওয়ার্ডস্প্লিটিং, প্যাথনাম এক্সপেনশন এবং প্যারামিটার এক্সপেনশন বুঝতে থাকেন তবে ব্যাশ কী করে তা বেশিরভাগই বোঝার পথে আপনি ভাল। নোট করুন যে ওয়ার্ডস্প্লিট করার পরে পথের নামটি প্রসারিত হওয়া সমালোচনাযোগ্য, কারণ এটি নিশ্চিত করে যে তার নামের সাদা অংশের একটি ফাইল এখনও একটি গ্লোব দ্বারা মিলে যেতে পারে। এই কারণেই গ্লোব বিস্তারের ভাল ব্যবহার সাধারণভাবে কমান্ডগুলি পার্সিংয়ের চেয়ে ভাল ।
ব্যাপ্তি
ফাংশন সুযোগ
অনেক পুরানো ইসসিএমএসক্রিপ্টের মতো শেলটির গতিশীল সুযোগ রয়েছে যতক্ষণ না আপনি কোনও ফাংশনের মধ্যে স্পষ্টভাবে নামগুলি ঘোষণা করেন।
$ foo() { echo $x; }
$ bar() { local x; echo $x; }
$ foo
$ bar
$ x=123
$ foo
123
$ bar
$ …
পরিবেশ এবং প্রক্রিয়া "সুযোগ"
সাবশেলগুলি তাদের পিতামাত শেলগুলির পরিবর্তনশীল উত্তরাধিকার সূত্রে প্রাপ্ত, তবে অন্যান্য ধরণের প্রক্রিয়াগুলি অপ্রত্যাশিত নামের উত্তরাধিকার সূত্রে পায় না।
$ x=123
$ ( echo $x )
123
$ bash -c 'echo $x'
$ export x
$ bash -c 'echo $x'
123
$ y=123 bash -c 'echo $y'
123
আপনি এই স্কোপিং বিধিগুলি একত্রিত করতে পারেন:
$ foo() {
> local -x bar=123
> bash -c 'echo $bar'
> }
$ foo
123
$ echo $bar
$
টাইপিং শৃঙ্খলা
উম, প্রকার। হ্যাঁ বাশের সত্যই প্রকার নেই, এবং সমস্ত কিছু স্ট্রিংয়ে প্রসারিত হয়েছে (বা সম্ভবত কোনও শব্দ আরও উপযুক্ত হবে)) তবে আসুন বিভিন্ন ধরণের বিস্তৃতি পরীক্ষা করা যাক।
স্ট্রিংস
খুব বেশি কিছু স্ট্রিং হিসাবে বিবেচনা করা যেতে পারে। ব্যাশের বেয়ারওয়ার্ডগুলি এমন স্ট্রিং রয়েছে যার অর্থ সম্পূর্ণরূপে এটি প্রয়োগিত বিস্তারের উপর নির্ভর করে।
কোনও প্রসারণ নেই
খালি শব্দটি সত্যই কেবল একটি শব্দ এবং এটিতে কোটেশনগুলি কিছুই পরিবর্তন করে না এমনটি প্রদর্শন করা সার্থক হতে পারে।
$ echo foo
foo
$ 'echo' foo
foo
$ "echo" foo
foo
সাবস্ট্রিং বিস্তৃতি
$ fail='echoes'
$ set -x
$ "${fail:0:-2}" Hello World
+ echo Hello World
Hello World
সম্প্রসারণ সম্পর্কে আরও জানতে Parameter Expansion
ম্যানুয়ালটির বিভাগটি পড়ুন । এটি বেশ শক্তিশালী।
পূর্ণসংখ্যা এবং পাটিগণিতের এক্সপ্রেশন
অ্যাসাইনমেন্ট এক্সপ্রেশনগুলির ডান হাতের শৈলীর গাণিতিক হিসাবে বিবেচনা করার জন্য শেলটি বলতে আপনি পূর্ণসংখ্যা বৈশিষ্ট্যের সাথে নামগুলি ইমবুউ করতে পারেন। তারপরে, যখন প্যারামিটারটি প্রসারিত হবে তখন… স্ট্রিংয়ে প্রসারিত হওয়ার আগে এটি পূর্ণসংখ্যার গণিত হিসাবে মূল্যায়ন করা হবে।
$ foo=10+10
$ echo $foo
10+10
$ declare -i foo
$ foo=$foo
$ echo $foo
20
$ echo "${foo:0:1}"
2
অ্যারে
যুক্তি এবং অবস্থানগত পরামিতি
অ্যারে সম্পর্কে কথা বলার আগে অবস্থানগত পরামিতিগুলি আলোচনা করা উপযুক্ত হতে পারে। একটি শেল স্ক্রিপ্ট আর্গুমেন্ট সংখ্যাযুক্ত পরামিতি ব্যবহার অ্যাক্সেস করা যেতে পারে $1
, $2
, $3
, ইত্যাদি আপনি এই সকল প্যারামিটার ব্যবহার একবারে অ্যাক্সেস করতে পারেন "$@"
, যা সম্প্রসারণ অ্যারে সঙ্গে সাধারণ অনেক কিছু হয়েছে। আপনি বিল্টিনগুলি set
বা shift
বিল্টিন ব্যবহার করে অবস্থানগত পরামিতিগুলি সেট এবং পরিবর্তন করতে পারেন , বা কেবলমাত্র এই পরামিতিগুলির সাহায্যে শেল বা শেল ফাংশনটি চাওয়ার মাধ্যমে:
$ bash -c 'for ((i=1;i<=$#;i++)); do
> printf "\$%d => %s\n" "$i" "${@:i:1}"
> done' -- foo bar baz
$1 => foo
$2 => bar
$3 => baz
$ showpp() {
> local i
> for ((i=1;i<=$#;i++)); do
> printf '$%d => %s\n' "$i" "${@:i:1}"
> done
> }
$ showpp foo bar baz
$1 => foo
$2 => bar
$3 => baz
$ showshift() {
> shift 3
> showpp "$@"
> }
$ showshift foo bar baz biz quux xyzzy
$1 => biz
$2 => quux
$3 => xyzzy
ব্যাশ ম্যানুয়াল কখনও কখনও $0
অবস্থানগত পরামিতি হিসাবেও বোঝায় । আমি এটি বিভ্রান্তিকর বলে মনে করি কারণ এটি আর্গুমেন্ট গণনায় এটি অন্তর্ভুক্ত করে না $#
, তবে এটি একটি সংখ্যাযুক্ত পরামিতি, তাই মেহ। $0
শেল বা বর্তমান শেল স্ক্রিপ্টের নাম।
অ্যারে
অ্যারেগুলির বাক্য গঠনটি পজিশনাল প্যারামিটারগুলির পরে তৈরি করা হয়, সুতরাং যদি আপনি চান তবে নামমাত্র "বাহ্যিক অবস্থানগত পরামিতি" হিসাবে অ্যারেগুলি ভাবা বেশিরভাগ স্বাস্থ্যকর। নিম্নলিখিত পদ্ধতিগুলি ব্যবহার করে অ্যারেগুলি ঘোষণা করা যেতে পারে:
$ foo=( element0 element1 element2 )
$ bar[3]=element3
$ baz=( [12]=element12 [0]=element0 )
আপনি সূচি দ্বারা অ্যারে উপাদান অ্যাক্সেস করতে পারেন:
$ echo "${foo[1]}"
element1
আপনি অ্যারে টুকরো টুকরো করতে পারেন:
$ printf '"%s"\n' "${foo[@]:1}"
"element1"
"element2"
আপনি যদি কোনও অ্যারেটিকে সাধারণ প্যারামিটার হিসাবে বিবেচনা করেন তবে আপনি জিরোথ সূচক পাবেন।
$ echo "$baz"
element0
$ echo "$bar"
$ …
আপনি যদি শব্দ বিভাজন রোধ করতে উদ্ধৃতি বা ব্যাকস্ল্যাশ ব্যবহার করেন তবে অ্যারে নির্দিষ্ট শব্দগুলির বিভাজন রক্ষণাবেক্ষণ করবে:
$ foo=( 'elementa b c' 'd e f' )
$ echo "${#foo[@]}"
2
অ্যারে এবং অবস্থানগত পরামিতিগুলির মধ্যে প্রধান পার্থক্য:
- অবস্থানগত পরামিতিগুলি বিরল নয়। যদি
$12
সেট করা থাকে তবে $11
আপনিও নিশ্চিত হতে পারেন যে সেটও রয়েছে set (এটি খালি স্ট্রিংয়ে সেট করা যেতে পারে তবে $#
এটি 12 এর চেয়ে কম হবে না) যদি "${arr[12]}"
সেট করা থাকে তবে "${arr[11]}"
সেট করার কোনও গ্যারান্টি নেই এবং অ্যারের দৈর্ঘ্য 1 এর চেয়ে কম হতে পারে।
- একটি অ্যারের জিরোথ উপাদানটি স্পষ্টতই সেই অ্যারের জিরোথ উপাদান। অবস্থানগত পরামিতিগুলিতে, জিরোথ উপাদানটি প্রথম যুক্তি নয় , শেল বা শেল স্ক্রিপ্টের নাম।
- করার
shift
একটি অ্যারের, আপনি ফালি আছে এবং এটি reassign মত arr=( "${arr[@]:1}" )
। আপনি এটি করতে পারেন unset arr[0]
, তবে এটি সূচক 1 এ প্রথম উপাদানটি তৈরি করবে।
- অ্যারেগুলি শ্বেত ফাংশনগুলির মধ্যে গ্লোবাল হিসাবে সুস্পষ্টভাবে ভাগ করা যায় তবে এটি দেখার জন্য আপনাকে শেল ফাংশনে স্পষ্টত অবস্থানগত পরামিতিগুলি দিতে হবে।
ফাইল নামগুলির অ্যারে তৈরি করতে প্রায়শই পথের নাম ব্যাবহার করা সুবিধাজনক:
$ dirs=( */ )
কমান্ড
কমান্ডগুলি কী, তবে সেগুলি ম্যানুয়াল দ্বারা আমার চেয়ে আরও ভাল গভীরতায় আবৃত। বিভাগ পড়ুন SHELL GRAMMAR
। বিভিন্ন ধরণের কমান্ডগুলি হ'ল:
- সাধারণ কমান্ড (যেমন
$ startx
)
- পাইপলাইন (যেমন
$ yes | make config
) (লোল)
- তালিকা (উদাঃ
$ grep -qF foo file && sed 's/foo/bar/' file > newfile
)
- যৌগিক কমান্ড (যেমন
$ ( cd -P /var/www/webroot && echo "webroot is $PWD" )
)
- কপ্রোসেসেস (জটিল, উদাহরণ নয়)
- ফাংশন (একটি নামযুক্ত যৌগিক কমান্ড যা সাধারণ কমান্ড হিসাবে বিবেচনা করা যেতে পারে)
এক্সিকিউশন মডেল
অবশ্যই মৃত্যুদন্ড কার্যকর করা মডেল একটি গাদা এবং একটি স্ট্যাক উভয় জড়িত। এটি সমস্ত ইউএনআইএক্স প্রোগ্রামের জন্য স্থানীয়। বাশের শেল ফাংশনগুলির জন্য কল স্ট্যাক রয়েছে যা caller
বিল্টিনের নেস্টেড ব্যবহারের মাধ্যমে দৃশ্যমান ।
তথ্যসূত্র:
SHELL GRAMMAR
ব্যাশ ম্যানুয়াল বিভাগে
- XCU শেল কমান্ড ভাষা ডকুমেন্টেশন
- ব্যাশ গাইড Greycat এর উইকি উপর।
- ইউএনআইএক্স পরিবেশে উন্নত প্রোগ্রামিং Advanced
আপনি যদি আমাকে নির্দিষ্ট দিকে আরও প্রসারিত করতে চান তবে দয়া করে মন্তব্য করুন।