আমি স্ক্রিপ্টিং বৈশিষ্ট্য আটকে যাব। সমৃদ্ধ ইন্টারেক্টিভ বৈশিষ্ট্যগুলি (কমান্ড লাইন সংস্করণ, সমাপ্তি, প্রম্পটস, ইত্যাদি) পুরোপুরি বেমানান উপায়ে একইরকম প্রভাব অর্জন করতে খুব আলাদা হতে থাকে। Zsh এ কোন বৈশিষ্ট্য রয়েছে এবং বাশ থেকে অনুপস্থিত বা এর বিপরীতে রয়েছে? ইন্টারেক্টিভ ব্যবহারের জন্য কয়েকটি পয়েন্টার দেয়।
ব্যাশের নিকটতম জিনিসটি এটিটি কেএস ৯৯ বা ম্যাক্স (কর্ন শেল এবং একটি ক্লোন) হবে। জেডএসের বৈশিষ্ট্যগুলির একটি উপসেট রয়েছে তবে আপনার এটি zsh নেটিভ মোডে নয়, ksh এমুলেশন মোডে চালানো দরকার।
আমি পসিক্স বৈশিষ্ট্যগুলি (যা কোনও আধুনিক sh
শেলের মধ্যে উপলব্ধ ), না তুলনামূলকভাবে অস্পষ্ট বৈশিষ্ট্যগুলি বা ইন্টারেক্টিভ ব্যবহারের জন্য উপরে উল্লিখিত বৈশিষ্ট্যগুলি হিসাবে তালিকাবদ্ধ করব না। ডেবিয়ান হুইজি হিসাবে পাওয়া পর্যবেক্ষণগুলি বশ ৪.২, কেএস ৯৩ ইউ এবং ম্যাক্স ৪০.৯.২০১২০630০ অনুসারে বৈধ।
$'…'
(ব্যাকস্ল্যাশ ইন্টারপোলেশন সহ আক্ষরিক স্ট্রিং) ksh93 এবং mksh এ উপলব্ধ। `$"… "(অনুবাদিত স্ট্রিং) বাশ-নির্দিষ্ট।
মিক্স এবং ksh93 ;&
একটি case
বিবৃতিতে পড়তে হয়েছে, তবে ;;&
পরবর্তী কেসগুলি পরীক্ষা করার জন্য নয় । মাকশ এর ;|
জন্য রয়েছে এবং সাম্প্রতিক মিক্স ;;&
সামঞ্জস্যতার অনুমতি দেয় ।
((…))
পাটিগণিতের এক্সপ্রেশন এবং [[ … ]]
পরীক্ষাগুলি হ'ল ksh বৈশিষ্ট্য। কিছু শর্তাধীন অপারেটর পৃথক, নীচে "শর্তসাপেক্ষ অভিব্যক্তি" দেখুন।
Ksh এবং বাশ উভয়েরই কপোরেসেস রয়েছে তবে তারা আলাদাভাবে কাজ করে।
Mksh এবং ksh93 function name {…}
স্ট্যান্ডার্ড ছাড়াও ফাংশন সংজ্ঞাগুলির জন্য সিনট্যাক্সকে সমর্থন করে name () {…}
তবে function
ksh এ ব্যবহার করে স্কোপিংয়ের নিয়ম পরিবর্তিত হয়, সুতরাং name () …
সামঞ্জস্যতা বজায় রাখতে আঁকড়ে থাকুন। ফাংশন নামের অনুমোদিত অক্ষরগুলির নিয়মগুলি পৃথক হয়; আলফানিউমেরিকস এবং লেগে থাকা _
।
Ksh93 এবং mksh সমর্থন বন্ধনী সম্প্রসারণ {foo,bar}
। Ksh93 সংখ্যাযুক্ত রেঞ্জগুলিকে সমর্থন {1..42}
করে তবে ম্যাক্স তা সমর্থন করে না।
Ksh93 এবং mksh সমর্থন সাবস্ট্রিং নিষ্কাশন ${VAR:offset}
এবং ${VAR:offset:length}
, কিন্তু না কেস মত ভাঁজ ${VAR^}
, ${VAR,}
ইত্যাদি আপনার সাথে ক্ষেত্রে রূপান্তর করতে পারি না typeset -l
এবং typeset -u
উভয় ব্যাশ ও ksh হবে।
তারা ${VAR/PATTERN/STRING}
বা এর সাথে প্রতিস্থাপন সমর্থন করে ${VAR/PATTERN//STRING}
। STRING এর উদ্ধৃতি বিধিগুলি কিছুটা পৃথক, সুতরাং STRING এ ব্যাকস্ল্যাশগুলি (এবং সম্ভবত অন্যান্য অক্ষরগুলি) এড়িয়ে চলুন (একটি পরিবর্তনশীল তৈরি করুন এবং ${VAR/PATTERN/$REPLACEMENT}
প্রতিস্থাপনে উদ্ধৃতি অক্ষর থাকলে পরিবর্তে ব্যবহার করুন)।
এরে সম্প্রসারণ ( ${ARRAY[KEY]}
, "${ARRAY[@]}"
, ${#ARRAY[@]}
, ${!ARRAY[@]}
) ksh মত ব্যাশ করছি না।
${!VAR}
বিস্তৃত ${OTHERVAR}
যখন মান VAR
হয় OTHERVAR
(পরোক্ষ পরিবর্তনশীল রেফারেন্স) ব্যাশ-নির্দিষ্ট (ksh সঙ্গে ভিন্ন কিছু নেই ${!VAR}
)। Ksh এ এই দ্বিগুণ প্রসারণ পেতে আপনার পরিবর্তে নামের রেফারেন্স ব্যবহার করতে হবে ( typeset -n VAR=OTHERVAR; echo "$VAR"
)। ${!PREFIX*}
একই কাজ করে।
প্রক্রিয়া প্রতিস্থাপন <(…)
এবং >(…)
mshh এ নয় ksh93 এ সমর্থিত।
Ksh প্রসারিত গ্লোব নিদর্শনগুলি যা shopt -s extglob
ব্যাশে সক্রিয় করার প্রয়োজন তা সবসময় ksh93 এবং mksh এ উপলব্ধ।
মাকশ চরিত্রের শ্রেণীর মতো সমর্থন করে না [[:alpha:]]
।
বাশ এবং ksh93 সিউডো-ফাইলগুলি সংজ্ঞায়িত করে এবং , কিন্তু ম্যাক্স তা দেয় না।/dev/tcp/HOST/PORT
/dev/udp/HOST/PORT
স্ক্রিপ্টগুলিতে পুনর্নির্দেশে ওয়াইল্ডকার্ডগুলি প্রসারিত করা (যেমন ফাইলের নামটি প্যাটার্নের সাথে একমাত্র মিল হিসাবে var="*.txt"; echo hello >$a
লিখিতভাবে লেখা a.txt
) বাশ-নির্দিষ্ট বৈশিষ্ট্য (অন্যান্য শেলগুলি স্ক্রিপ্টগুলিতে কখনও তা করে না)।
<<<
এখানে স্ট্রিংগুলি ব্যাশের মতো ksh এ কাজ করে।
>&
সিনট্যাক্স ত্রুটিগুলি পুনর্নির্দেশের শর্টকাটটিও mksh দ্বারা সমর্থিত তবে ksh93 দ্বারা নয়।
[[ … ]]
ডাবল বন্ধনী সিনট্যাক্স
Ksh থেকে ডাবল ব্র্যাকেট সিনট্যাক্স উভয় এটিটি ksh93 এবং ব্যাশের মতো ম্যাক্স দ্বারা সমর্থিত।
ফাইল অপারেটর
Ksh93, mksh এবং bash POSIX- তে একই এক্সটেনশানগুলিকে সমর্থন করে, যার -a
একটি অপ্রচলিত প্রতিশব্দ -e
, -k
(স্টিকি), -G
(ইজিডের মালিকানাধীন), -O
(ইউইডির মালিক), -ef
(একই ফাইল), -nt
(এর চেয়ে -ot
পুরানো) এর চেয়ে বড় রয়েছে including
-N FILE
(সর্বশেষ পঠনের পর থেকে সংশোধিত) এমএক্সএইচ দ্বারা সমর্থিত নয়।
মিকসের কাছে একটি রেজিপ্যাক্স ম্যাচিং অপারেটর নেই =~
। Ksh93 এর এই অপারেটরটি রয়েছে এবং এটি ব্যাশের মতো একই ম্যাচটি সম্পাদন করে তবে এর BASH_REMATCH
সাথে মিলে যাওয়া গ্রুপগুলি পুনরুদ্ধার করার সমতুল্য নেই ।
স্ট্রিং অপারেটর
Ksh93 এবং mksh একই স্ট্রিং তুলনা অপারেটর <
এবং >
বাশ পাশাপাশি এর ==
প্রতিশব্দ হিসাবে সমর্থন করে =
। মিক্স অভিধান সংক্রান্ত ক্রম নির্ধারণের জন্য স্থানীয় সেটিংস ব্যবহার করে না, এটি স্ট্রিংকে বাইট স্ট্রিংগুলির সাথে তুলনা করে।
অন্যান্য অপারেটর
-v VAR
কোনও ভেরিয়েবল সংজ্ঞায়িত করা হয়েছে তা পরীক্ষা করতে বাশ-নির্দিষ্ট। যে কোনও পসিক্স শেল, আপনি ব্যবহার করতে পারেন [ -z "${VAR+1}" ]
।
ওরফে নামগুলিতে অনুমোদিত অক্ষরের সেটটি সমস্ত শেলের ক্ষেত্রে একই নয়। আমি মনে করি এটি ফাংশনগুলির জন্য একই (উপরে দেখুন)।
Ksh93 এর একটি বিল্টিন নামে পরিচিত builtin
, তবে এটি বিল্ট-ইন কমান্ড হিসাবে কোনও নাম কার্যকর করে না। command
এলিয়াস এবং ফাংশনগুলিকে বাইপাস করতে ব্যবহার করুন ; এটি উপস্থিত থাকলে একটি বিল্টিনকে কল করবে, অন্যথায় একটি বাহ্যিক আদেশ (আপনি এটি এড়াতে পারেন PATH= command error_out_if_this_is_not_a_builtin
)।
এটি বাশ-নির্দিষ্ট। আপনার সাথে একটি অনুরূপ প্রভাব পেতে পারেন .sh.fun
, .sh.file
এবং .sh.lineno
ksh93 হবে। মিক্সে শেষ আছে LINENO
।
declare
ksh's এর জন্য বাশ-নির্দিষ্ট নাম typeset
। ব্যবহার করুন typeset
: এটি ব্যাশে কাজ করে।
মিক্স local
একটি উপাধিকার হিসাবে সংজ্ঞা দেয় typeset
। Ksh93- এ আপনাকে ব্যবহার করতে হবে typeset
(বা একটি উপনাম সংজ্ঞায়িত করতে হবে )।
মিকসের কোনও সহযোগী অ্যারে নেই (এগুলি এখনও অপ্রকাশিত সংস্করণ হিসাবে সজ্জিত রয়েছে)।
আমি মনে করি না যে typeset -t
ksh এ বাশের (ট্রেস ফাংশন) এর সঠিক সমতুল্য আছে ।
Ksh93 নেই -e
।
Ksh93 এবং mksh বাশ-এর মতো বিকল্পগুলি -e
এবং -n
বিকল্পগুলি প্রক্রিয়া করে । মাকশ আরও বোঝে -E
, ksh93 এটিকে বিকল্প হিসাবে বিবেচনা করে না। ব্যাকস্ল্যাশ প্রসারণটি ডিফল্টরূপে ksh93 এ বন্ধ আছে, mksh এ ডিফল্টরূপে।
Ksh বিল্টিন কমান্ডগুলি অক্ষম করার কোনও উপায় সরবরাহ করে না। একটি বিল্টিন এড়ানোর জন্য, বাহ্যিক কমান্ডের পথটি দেখুন এবং এটিকে স্পষ্টভাবে প্রার্থনা করুন।
Ksh93 আছে -a
তবে নেই -l
। মক্ষেরও নেই।
Ksh93 বা mksh নেই export -n
। typeset +x foo
পরিবর্তে ব্যবহার করুন, এটি ব্যাশ এবং ksh এ কাজ করে।
Ksh পরিবেশের মাধ্যমে ফাংশন রফতানি করে না।
let
বাশ এবং কেএসএ তে একই।
এটি ব্যাশ-নির্দিষ্ট বৈশিষ্ট্য। আপনি while read
কোনও ফাইল পড়তে লুপস বা কমান্ড প্রতিস্থাপন ব্যবহার করতে পারেন এবং এটিকে লাইনের একটি অ্যারে বিভক্ত করতে পারেন। যত্ন নিন IFS
এবং গ্লোববিং করুন। এখানে এর সমতুল্য mapfile -t lines </path/to/file
:
IFS=$'\n'; set -f
lines=($(</path/to/file))
unset IFS; set +f
printf
খুব অনুরূপ। আমি মনে করি ksh93 বাশের সমস্ত ফর্ম্যাট নির্দেশকে সমর্থন করে। mksh সমর্থন করে না %q
বা %(DATE_FORMAT)T
; কিছু ইনস্টলেশনে, printf
কোনও ম্যাক্স বিল্টিন নয় এবং এর পরিবর্তে বাহ্যিক কমান্ডটি কল করে।
printf -v VAR
বাশ-নির্দিষ্ট, ksh সর্বদা স্ট্যান্ডার্ড আউটপুট প্রিন্ট করে।
রিডলাইন সম্পর্কিত সমস্তগুলি সহ বেশ কয়েকটি বিকল্প বাশ-নির্দিষ্ট। অপশন -r
, -d
, -n
, -N
, -t
, -u
ব্যাশ, ksh93 এবং mksh মধ্যে অভিন্ন।
আপনি Ksh93 এ কেবল পঠনযোগ্য হিসাবে একই ভেরিয়েবল এবং একই সিনট্যাক্স সহ mksh হিসাবে ঘোষিত করতে পারেন। যদি ভেরিয়েবলটি একটি অ্যারে হয় তবে আপনাকে প্রথমে এটি নির্ধারণ করতে হবে, তারপরে এটিকে কেবল পঠনযোগ্য করে তুলুন readonly VAR
। ফাংশনগুলি কেবল ksh এ পঠনযোগ্য করা যায় না।
সমস্ত বিকল্প set
এবং set -o
এর মধ্যে পসিক্স বা কেএসএস বৈশিষ্ট্য রয়েছে।
shopt
বাশ-নির্দিষ্ট অনেকগুলি বিকল্প যেভাবেই ইন্টারেক্টিভ ব্যবহারের বিষয়ে উদ্বেগ প্রকাশ করে। কিছু বিকল্প দ্বারা সক্ষম গ্লোব্বিং এবং অন্যান্য বৈশিষ্ট্যগুলির উপর প্রভাবগুলির জন্য, নীচে বিভাগ "বিকল্পগুলি" দেখুন।
এই রূপটি .
ksh তেও বিদ্যমান। বাশ এবং ম্যাক্সে, source
পরে বর্তমান ডিরেক্টরিটি অনুসন্ধান করে PATH
তবে ksh93-তে এটি একটি সমতুল্য সমতুল্য .
।
DEBUG
সিউডো-সংকেত mksh বাস্তবায়িত হয় না। Ksh93 এ, তথ্য প্রতিবেদন করার বিভিন্ন উপায়ে এটি উপস্থিত রয়েছে, বিশদগুলির জন্য ম্যানুয়ালটি দেখুন।
Ksh এ, এর type
জন্য একটি উপনাম whence -v
। মিক্সে, type -p
এক্সিকিউটেবলের জন্য পাথ প্রিন্ট করে না, তবে একটি মানব-পঠনযোগ্য বার্তা; whence -p COMMAND
পরিবর্তে আপনার প্রয়োজন ।
বিকল্প
shopt -s dotglob
- গ্লোববিংয়ে ডট ফাইলগুলি উপেক্ষা করবেন না
dotglob
Ksh93 এ বিকল্পটি অনুকরণ করতে, আপনি সেট করতে পারেন FIGNORE='@(.|..)'
। আমি মনে করি না মিক্সে এর মতো কিছু আছে।
extglob
বিকল্প ksh উপর সবসময় কার্যকরভাবে হয়।
shopt -s failglob
- যদি কোনও গ্লোব প্যাটার্ন কোনও কিছুর সাথে মেলে না তবে ত্রুটি out
আমি মনে করি না এটি mksh বা ksh93 এর মধ্যে বিদ্যমান। এটা তোলে zsh মধ্যে আছে (ডিফল্ট আচরণ যদি না null_glob
বা csh_null_glob
সেট)।
Ksh93 এর সাথে পুনরাবৃত্তিমূলক গ্লোববিং রয়েছে **/
, এটি সক্ষম করা হয়েছে set -G
। মিক্সের পুনরাবৃত্ত গ্লোববিং নেই।
shopt -s lastpipe
- প্যারেন্ট শেলটিতে পাইপলাইনের শেষ কমান্ডটি চালান
Ksh93 সর্বদা প্যারেন্ট শেলের একটি পাইপলাইনের শেষ কমান্ড চালায়, যার জন্য ব্যাশে lastpipe
বিকল্প সেট করার প্রয়োজন হয় । মিক্স সর্বদা সাবসিলে পাইপলাইনের সর্বশেষ কমান্ড চালায়।
shopt -s nocaseglob
, shopt -s nocasematch
- কেস-সংবেদনশীল নিদর্শন
মিকসের কেস-সংবেদনশীল প্যাটার্নের মিল নেই। Ksh93 এটি একটি প্যাটার্ন-বাই-প্যাটার্ন ভিত্তিতে সমর্থন করে: সাথে প্যাটার্নটির উপসর্গ করুন ~(i)
।
shopt -s nullglob
- নিদর্শনগুলি প্রসারিত করুন যা কোনও ফাইলের সাথে খালি তালিকার সাথে মেলে না
মাকসের কাছে এটি নেই। Ksh93 এটি একটি প্যাটার্ন-বাই-প্যাটার্ন ভিত্তিতে সমর্থন করে: সাথে প্যাটার্নটির উপসর্গ করুন ~(N)
।
স্পষ্টতই বেশিরভাগ BASH_xxx
ভেরিয়েবলের ksh তে বিদ্যমান নেই। $BASHPID
ব্যয়বহুল তবে পোর্টেবলের সাথে অনুকরণ করা যেতে পারে sh -c 'echo $PPID'
এবং সম্প্রতি ম্যাক্সে যুক্ত করা হয়েছে। BASH_LINE
হয় .sh.lineno
ksh93 এবং LINENO
mksh হবে। BASH_SUBSHELL
হয় .sh.subshell
ksh93 হবে।
Mksh এবং ksh93 উভয়ই সূচনা করে যে ফাইলগুলি ENV
শুরু হয়।
EUID
এবং UID
ksh93 তে বিদ্যমান নেই। মাক্স তাদের ডাকে USER_ID
এবং KSH_UID
; এটা নেই GROUPS
।
FUNCNAME
এবং FUNCNEST
ksh এ বিদ্যমান নেই। Ksh93 আছে .sh.fun
এবং .sh.level
। ঘোষিত ক্রিয়াকলাপগুলির সাথে function foo { …; }
(কোনও বন্ধনী নেই!) এর নিজস্ব নাম রয়েছে $0
।
GLOBIGNORE
ksh93 এ বিদ্যমান তবে একটি আলাদা নাম এবং বাক্য গঠন সহ: এটি বলা হয়ে থাকে FIGNORE
এবং এটি একটি একক প্যাটার্ন, কোলন-বিভক্ত তালিকা নয়। একটি @(…|…)
প্যাটার্ন ব্যবহার করুন । FIGNORE
সম্পূর্ণ আলাদা সিনট্যাক্স সহ Ksh এর সাবমিশম ব্যাশ।
Ksh93 এবং mksh মত কিছুই নেই HOSTTYPE
, MACHTYPE
এবং OSTYPE
। তাছাড়াও SHELLOPTS
বা TIMEFORMAT
।
মিক্স আছে PIPESTATUS
, কিন্তু ksh93 নেই।
মক্ষ এবং ksh93 আছে RANDOM
।