मैं स्क्रिप्टिंग सुविधाओं से चिपके रहूंगा। रिच इंटरएक्टिव फीचर्स (कमांड लाइन संस्करण, पूर्णता, संकेत, आदि) पूरी तरह से भिन्न होते हैं, पूर्ण असंगत तरीकों से समान प्रभाव प्राप्त करते हैं। ज़श में क्या विशेषताएं हैं और बैश से गायब हैं, या इसके विपरीत? इंटरैक्टिव उपयोग पर कुछ संकेत देता है।
बैश करने के लिए निकटतम चीज़ ATT ksh93 या mksh (कोर्न शेल और एक क्लोन) होगी। Zsh में विशेषताओं का एक सबसेट भी है, लेकिन आपको इसे ksh इम्यूलेशन मोड में चलाने की आवश्यकता होगी, न कि zsh के मूल मोड में।
मैं POSIX सुविधाओं (जो किसी भी आधुनिक sh
शेल में उपलब्ध हैं ) को सूचीबद्ध नहीं करूंगा , न ही अपेक्षाकृत अस्पष्ट विशेषताएं, और न ही इंटरैक्टिव उपयोग के लिए उपरोक्त सुविधाओं के रूप में। अवलोकन बाश 4.2, ksh 93u और mksh 40.9.20120630 के अनुसार मान्य हैं जैसा कि डेबियन मट्ठा पर पाया जाता है।
$'…'
(बैकस्लैश इंटरपोलेशन के साथ शाब्दिक तार) ksh93 और mksh में उपलब्ध है। `$" ... "(अनुवादित स्ट्रिंग्स) बैश-विशिष्ट है।
Mksh और ksh93 को ;&
एक case
बयान के माध्यम से गिरना है , लेकिन ;;&
बाद के मामलों का परीक्षण करने के लिए नहीं । Mksh के ;|
लिए है कि, और हाल ही में mksh ;;&
संगतता के लिए अनुमति देता है।
((…))
अंकगणितीय अभिव्यक्ति और [[ … ]]
परीक्षण ksh विशेषताएँ हैं। कुछ सशर्त ऑपरेटर अलग-अलग हैं, नीचे "सशर्त अभिव्यक्ति" देखें।
Ksh और bash दोनों में कोप्रोसेस हैं लेकिन वे अलग तरह से काम करते हैं।
Mksh और ksh93 function name {…}
मानक के अलावा फ़ंक्शन परिभाषाओं के लिए वाक्यविन्यास का समर्थन करते हैं name () {…}
, लेकिन function
ksh परिवर्तनों का उपयोग करने के name () …
लिए नियम बनाते हैं, इसलिए संगतता बनाए रखने के लिए छड़ी । फ़ंक्शन नामों में अनुमत वर्णों के नियम भिन्न होते हैं; अल्फ़ान्यूमेरिक्स और से चिपके रहते हैं _
।
Ksh93 और mksh समर्थन ब्रेस विस्तार {foo,bar}
। Ksh93 न्यूमेरिक रेंज का समर्थन करता है, {1..42}
लेकिन mksh नहीं करता है।
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*}
वही काम करता है।
प्रक्रिया प्रतिस्थापन <(…)
और >(…)
ksh93 में समर्थित है, लेकिन mksh में नहीं।
shopt -s extglob
Ksh93 और mksh में ksh विस्तारित ग्लोब पैटर्न जिन्हें बैश में सक्रिय करने की आवश्यकता होती है, वे हमेशा उपलब्ध रहते हैं।
Mksh वर्ण वर्गों का समर्थन नहीं करता है [[:alpha:]]
।
बैश और ksh93 छद्म फाइलों को परिभाषित करते हैं और , लेकिन mksh नहीं करता है।/dev/tcp/HOST/PORT
/dev/udp/HOST/PORT
लिपियों में एक पुनर्निर्देशन में वाइल्डकार्ड का विस्तार (के रूप में var="*.txt"; echo hello >$a
करने के लिए लिख a.txt
अगर उस फ़ाइल नाम पैटर्न के लिए एकमात्र मुकाबला नहीं है) एक पार्टी विशेष सुविधा (अन्य गोले लिपियों में ऐसा कभी नहीं) है।
<<<
यहाँ-स्ट्रिंग्स ksh में kash की तरह काम करते हैं।
>&
सिंटेक्स त्रुटियों को पुनर्निर्देशित करने का शॉर्टकट भी mksh द्वारा समर्थित है, लेकिन ksh93 द्वारा नहीं।
[[ … ]]
डबल ब्रैकेट सिंटैक्स
Ksh से डबल ब्रैकेट सिंटैक्स को ATT ksh93 और mashh दोनों द्वारा बैश में सपोर्ट किया जाता है।
फ़ाइल ऑपरेटर
Ksh93, mksh और bash POSIX के लिए एक ही एक्सटेंशन का समर्थन करते हैं, जिसमें -a
एक अप्रचलित पर्यायवाची के रूप में शामिल है -e
, -k
(चिपचिपा), -G
(egid के स्वामित्व वाला), -O
(यूरोप के मालिक), -ef
(एक ही फ़ाइल), -nt
(नए की तुलना में), -ot
(पुराने से पुराना)।
-N FILE
(पिछले पढ़ने के बाद से संशोधित) mksh द्वारा समर्थित नहीं है।
Mksh में एक regexp मिलान ऑपरेटर नहीं है =~
। Ksh93 के पास यह ऑपरेटर है, और यह बैश के समान मिलान करता है, लेकिन BASH_REMATCH
मिलान किए गए समूहों को फिर से प्राप्त करने के बराबर नहीं है ।
स्ट्रिंग ऑपरेटरों
Ksh93 और mksh एक ही स्ट्रिंग तुलना ऑपरेटरों <
और >
बैश के साथ-साथ ==
पर्याय का समर्थन करते हैं =
। Mksh lexicographic क्रम को निर्धारित करने के लिए स्थानीय सेटिंग्स का उपयोग नहीं करता है, यह बाइट्स स्ट्रिंग्स के रूप में तार की तुलना करता है।
अन्य ऑपरेटर
-v VAR
परीक्षण करने के लिए यदि एक चर परिभाषित किया गया है, तो वह बैश-विशिष्ट है। किसी भी POSIX शेल में, आप उपयोग कर सकते हैं [ -z "${VAR+1}" ]
।
अन्य नामों में अनुमत वर्ण का सेट सभी गोले में समान नहीं है। मुझे लगता है कि यह फ़ंक्शन के लिए समान है (ऊपर देखें)।
Ksh93 में एक अंतर्निहित नाम है builtin
, लेकिन यह एक अंतर्निहित कमांड के रूप में एक नाम निष्पादित नहीं करता है। command
उपनाम और कार्यों को बायपास करने के लिए उपयोग करें ; यदि कोई मौजूद है, तो यह बिलिन को कॉल करेगा, अन्यथा एक बाहरी कमांड (आप इससे बच सकते हैं PATH= command error_out_if_this_is_not_a_builtin
)।
यह बैश-विशिष्ट है। आप के साथ .sh.fun
, .sh.file
और .sh.lineno
ksh93 में एक समान प्रभाव प्राप्त कर सकते हैं । Mksh में आखिरी में है LINENO
।
declare
ksh के लिए एक बैश-विशिष्ट नाम है typeset
। उपयोग typeset
: यह बाश में भी काम करता है।
Mksh के local
लिए एक उपनाम के रूप में परिभाषित करता है typeset
। Ksh93 में, आपको उपयोग typeset
(या एक उपनाम को परिभाषित करने की आवश्यकता है )।
Mksh के पास कोई सहयोगी सरणियाँ नहीं हैं (वे अभी तक अप्रबंधित संस्करण के लिए स्लेट किए गए हैं)।
मुझे नहीं लगता कि typeset -t
ksh में bash (ट्रेस फ़ंक्शन) का एक सटीक समकक्ष है ।
Ksh93 नहीं है -e
।
Ksh93 और mksh प्रक्रिया -e
और -n
विकल्प की तरह bash में। Mksh भी समझता है -E
, ksh93 इसे एक विकल्प के रूप में नहीं मानता है। बैकस्लैश का विस्तार डिफ़ॉल्ट रूप से ksh93 में बंद है, डिफ़ॉल्ट रूप से mksh में।
Ksh अंतर्निहित कमांड को अक्षम करने का एक तरीका प्रदान नहीं करता है। एक बिलिन से बचने के लिए, बाहरी कमांड के पथ को देखें और इसे स्पष्ट रूप से लागू करें।
Ksh93 है -a
लेकिन नहीं -l
। Mksh न तो है।
न तो 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 सभी bash के प्रारूप निर्देशों का समर्थन करता है। mksh समर्थन नहीं करता है %q
या %(DATE_FORMAT)T
; कुछ संस्थापनों पर, printf
mksh buildin नहीं है और इसके बजाय बाहरी कमांड को कॉल करता है।
printf -v VAR
बैश-विशिष्ट है, ksh हमेशा मानक आउटपुट पर प्रिंट करता है।
रीडलाइन के बारे में सभी विकल्पों सहित कई विकल्प बाश-विशिष्ट हैं। विकल्प -r
, -d
, -n
, -N
, -t
, -u
बैश, ksh93 और mksh में समान हैं।
आप चर को केवल Ksh93 में पढ़ सकते हैं और उसी वाक्य रचना के साथ mksh घोषित कर सकते हैं। यदि चर एक सरणी है, तो आपको पहले इसे असाइन करने की आवश्यकता है, फिर इसे केवल-पढ़ने के लिए बनाएं readonly VAR
। क्रियाओं को केवल ksh में ही नहीं पढ़ा जा सकता है।
करने के लिए सभी विकल्प set
और set -o
POSIX या ksh विशेषताएं हैं।
shopt
बैश-विशिष्ट है। कई विकल्प वैसे भी इंटरैक्टिव उपयोग की चिंता करते हैं। ग्लोबिंग और कुछ विकल्पों द्वारा सक्षम अन्य सुविधाओं पर प्रभाव के लिए, नीचे दिए गए "विकल्प" अनुभाग देखें।
यह संस्करण .
ksh में भी मौजूद है। बैश और mksh में, के source
बाद वर्तमान निर्देशिका खोजता है PATH
, लेकिन ksh93 में, इसका सटीक समकक्ष है .
।
DEBUG
छद्म संकेत mksh में लागू नहीं है। Ksh93 में, यह सूचना को रिपोर्ट करने के लिए एक अलग तरीके से मौजूद है, विवरण के लिए मैनुअल देखें।
Ksh में, के type
लिए एक उपनाम है whence -v
। Mksh में, type -p
निष्पादन योग्य के लिए पथ प्रिंट नहीं करता है, लेकिन एक मानव-पठनीय संदेश; आपको whence -p COMMAND
इसके बजाय उपयोग करने की आवश्यकता है ।
विकल्प
shopt -s dotglob
- ग्लोबिंग में डॉट फाइल्स को नजरअंदाज न करें
dotglob
Ksh93 में विकल्प का अनुकरण करने के लिए , आप सेट कर सकते हैं FIGNORE='@(.|..)'
। मुझे नहीं लगता कि mksh में ऐसा कुछ है।
extglob
विकल्प ksh में हमेशा प्रभावी ढंग से है।
shopt -s failglob
- ग्लोब पैटर्न कुछ नहीं होने पर त्रुटि
मुझे नहीं लगता कि यह mksh या ksh93 में मौजूद है। यह zsh में करता है (डिफ़ॉल्ट व्यवहार जब तक null_glob
या csh_null_glob
सेट न हो)।
Ksh93 के साथ पुनरावर्ती ग्लोबिंग है **/
, जिसके साथ सक्षम किया गया है set -G
। Mksh में पुनरावर्ती ग्लोबिंग नहीं है।
shopt -s lastpipe
- पैरेंट शेल में पाइप लाइन की अंतिम कमांड चलाएं
Ksh93 हमेशा पैरेंट शेल में पाइप लाइन की अंतिम कमांड चलाता है, जिसे बैश में lastpipe
सेट करने के विकल्प की आवश्यकता होती है । Mksh हमेशा एक उपधारा में पाइपलाइन की अंतिम कमांड चलाता है।
shopt -s nocaseglob
, shopt -s nocasematch
केस-असंवेदनशील पैटर्न
Mksh केस-असंवेदनशील पैटर्न से मेल नहीं खाता है। Ksh93 एक पैटर्न-दर-पैटर्न के आधार पर इसका समर्थन करता है: पैटर्न के साथ उपसर्ग ~(i)
।
shopt -s nullglob
- उन प्रतिमानों का विस्तार करें, जो खाली सूची में किसी फ़ाइल से मेल नहीं खाते हैं
Mksh यह नहीं है। Ksh93 एक पैटर्न-दर-पैटर्न के आधार पर इसका समर्थन करता है: पैटर्न के साथ उपसर्ग ~(N)
।
स्पष्ट रूप से अधिकांश BASH_xxx
चर ksh में मौजूद नहीं हैं। $BASHPID
महंगा लेकिन पोर्टेबल के साथ अनुकरण किया जा सकता है sh -c 'echo $PPID'
, और हाल ही में mksh में जोड़ा गया है। BASH_LINE
है .sh.lineno
ksh93 में और LINENO
mksh में। BASH_SUBSHELL
है .sh.subshell
ksh93 में।
Mksh और ksh93 दोनों स्रोत फ़ाइल ENV
जब वे शुरू करते हैं।
EUID
और UID
ksh93 में मौजूद नहीं है। Mksh उन्हें फोन USER_ID
और KSH_UID
; यह नहीं है GROUPS
।
FUNCNAME
और FUNCNEST
ksh में मौजूद नहीं है। Ksh93 .sh.fun
और है .sh.level
। के साथ घोषित कार्य function foo { …; }
(कोई कोष्ठक नहीं!) का अपना नाम है $0
।
GLOBIGNORE
ksh93 में मौजूद है, लेकिन एक अलग नाम और वाक्य रचना के साथ: इसे कहा जाता है FIGNORE
, और यह एक एकल पैटर्न है, न कि एक अलग-अलग सूची। एक @(…|…)
पैटर्न का उपयोग करें । Ksh की FIGNORE
उपमाएं पूरी तरह से अलग वाक्यविन्यास के साथ बैश की हैं।
Ksh93 और mksh की तरह कुछ भी नहीं है HOSTTYPE
, MACHTYPE
और OSTYPE
। न ही SHELLOPTS
या TIMEFORMAT
।
Mksh है PIPESTATUS
, लेकिन ksh93 नहीं करता है।
Mksh और ksh93 है RANDOM
।