मैं खुद को एक खुश बैश उपयोगकर्ता मानता हूँ। हालांकि, जब मैंने यूनिक्स की खोज शुरू की, तो यह एक मालिकाना यूनिक्स सिस्टम पर था जो डिफ़ॉल्ट रूप से tcsh प्रदान करता था, इसलिए मेरे शुरुआती शेल अनुभव C शेल (csh) के आधुनिक संस्करण पर थे। यह एक भाग्यशाली दुर्घटना साबित हुई क्योंकि tcsh उस फिल्म स्टूडियो में भी पसंद का शेल था जहां मैंने बाद में अपने करियर में काम किया।
आज तक, कई कार्य हैं जिन्हें मैं tcsh से जोड़ता हूँ, भले ही वहाँ कोई तार्किक संबंध न हो। मैं अभी भी कम से कम एक सिस्टम पर tcsh का उपयोग करता हूँ, केवल अभ्यास में बने रहने के लिए। मैं इसे अपने सभी सिस्टम पर इंस्टॉल रखता हूँ ताकि मेरे अपने tcsh स्क्रिप्ट के साथ संगतता बनी रहे और यह सुनिश्चित हो सके कि जब मुझे tcsh में एक स्क्रिप्ट लिखना पसंद हो तो मैं इसे लॉन्च कर सकूं।
C शेल और बैश के बीच अंतर
Tcsh csh का आधुनिक निरंतरता है। जब C शेल 1978 में जारी किया गया था, तो उपयोगकर्ता इसके C-जैसे सिंटैक्स को लेकर उत्साहित थे। C उस समय एक नई प्रोग्रामिंग भाषा थी, और अधिक महत्वपूर्ण बात यह है कि यूनिक्स इसी में लिखा गया था, इसलिए अधिकांश यूनिक्स उपयोगकर्ता एक मनमानी स्क्रिप्टिंग भाषा की तुलना में C के साथ अधिक सहज थे। उदाहरण के लिए, बैश में, यह if लूप सशर्त स्टेटमेंट (ब्रैकेट में भाग) का मूल्यांकन करने के लिए test बाइनरी को एक "गुप्त" कॉल करता है:
v=1
if [ $v -gt 0 ]
then
echo "verbose"
fi
यहाँ csh या tcsh में वही स्टेटमेंट है, test के लिए बाहरी कॉल के बिना क्योंकि सशर्त स्टेटमेंट (कोष्ठक में कोड) csh के बिल्ट-इन मूल्यांकन का उपयोग करता है:
set v=1
if ($v > 1) then
echo "verbose"
endif
यह कुछ चीजों को दर्शाता है, दोनों अच्छे और बुरे। उदाहरण के लिए, C प्रोग्रामर के लिए कोष्ठक में एक सशर्त टाइप करना स्वाभाविक है, और प्रोग्रामर के दृष्टिकोण से गणित मूल्यांकन को एक्जीक्यूटेबल में अंतर्निहित करना वांछनीय है। दूसरी ओर, if लूप सिंटैक्स में Lua की तुलना में C के साथ अधिक समानता है, जो डिलीमीटर के रूप में ब्रेसिज़ का उपयोग करता है:
// यह Csh में काम नहीं करता
if ( v>1 ) {
printf("verbose");
}
एक तरह से, यह csh को अच्छी तरह से सारांशित करता है: यह साफ, कुशल, और कुछ के लिए परिचित है, लेकिन विचित्र और असंगत।
तो इसका उपयोग क्यों करें?
सटीकता के लिए Tcsh
मैं C की तुलना में अधिक C++ और जावा कोड लिखता हूँ, इसलिए tcsh में मेरी रुचि इसके ऐतिहासिक दावे से कम साझा करती है। हालांकि, मुझे Lua पसंद है, और एक तरह से, मैं tcsh और अन्य शेल के बारे में वैसे ही सोचता हूँ जैसे मैं Lua और पायथन या यहां तक कि मार्कडाउन और डॉकबुक के बारे में सोचता हूँ। दोनों शेल में योग्यता है, और अधिक लोकप्रिय वाले को इंगित करना आसान है, लेकिन दूसरे में एक सख्त स्पष्टता है। वास्तव में, मुझे लगता है कि tcsh में एक सटीकता है जो कई अन्य शेल में कमी है।
वेरिएबल
शेल में आपको टाइप किए गए वेरिएबल की विलासिता नहीं मिलती, लेकिन tcsh के साथ, आप कम से कम उन्हें एक कीवर्ड के साथ घोषित कर सकते हैं। अजीब तरह से, इस कार्य के लिए कई कीवर्ड हैं जिनका आप उपयोग कर सकते हैं, लेकिन जिस पर मैं बस गया वह set था:
> set var=foo
> echo $var
foo
आप वेरिएबल के नाम (var इस उदाहरण में) को टाइप करके और फिर Ctrl+X उसके बाद $ (डॉलर) कुंजी दबाकर वेरिएबल का विस्तार कर सकते हैं। उपरोक्त उदाहरण var को foo पर सेट करता है।
कई अन्य शेल की तरह, आप set का उपयोग बिना तर्कों के अकेले सभी सेट वेरिएबल को सूचीबद्ध करने के लिए कर सकते हैं:
> set
term xterm
tty pts/2
uid 1000
user seth
var foo
[...]
आप unset कमांड का उपयोग करके एक वेरिएबल को अनसेट कर सकते हैं:
> unset var
> set | grep var
>
लापता सुविधाएँ एक सुविधा है
शायद आपने स्क्रिप्ट में ऐसी लाइनें देखी हैं:
var=GitLab
${var,,}
दूसरी लाइन var की सामग्री को लोअरकेस में बदलने के लिए एक बिल्ट-इन फंक्शन है।
जबकि ऐसी अतिरिक्त फंक्शन अनंत रूप से उपयोगी हैं, मुझे कभी-कभी लगता है कि वे अस्पष्टता को आमंत्रित करते हैं। शेल स्क्रिप्टिंग प्रोग्रामिंग का HTML है; यह उन कुछ गंभीर भाषाओं में से एक है जिसे आप केवल दूसरे लोगों का कोड पढ़कर खुद सीख सकते हैं। यह उपयोगी फंक्शन छोड़ने का एक बड़ा कारण नहीं है, लेकिन यह कारण है कि मैं विभिन्न भाषाओं में लोकप्रिय क्रिप्टिक शॉर्टहैंड का उपयोग करने से बचने की कोशिश करता हूँ। जब tcsh में लिख रहा होता हूँ, तो मेरे पास उतना शॉर्टहैंड उपयोग करने का विकल्प नहीं होता, इसलिए जटिल स्ट्रिंग ऑपरेशन को बिल्ट-इन शॉर्टकट के बजाय बुनियादी यूनिक्स टूल्स के साथ किया जाना चाहिए। मेरा मानना है कि इसका परिणाम कोड होता है जिसे पढ़ना आसान होता है, और यह भविष्य के योगदानकर्ताओं—और भविष्य के, भुलक्कड़ मुझे के लिए एक बड़ा अंतर लाता है।
बिल्ट-इन गणित
tcsh के बारे में मुझे जो चीजें पसंद हैं उनमें से एक है इसका बिल्ट-इन @ मैथ शॉर्टकट। अधिकांश स्व-शिक्षित यूनिक्स उपयोगकर्ताओं की तरह, मैं bc पर ठोकर खाई, और मैंने तब से इसका पछतावा किया है। अपनी कोई गलती नहीं होने के बावजूद, bc को अक्सर उपयोगकर्ताओं को कमांड-लाइन कैलकुलेटर के रूप में सिखाया जाता है जब यह वास्तव में एक गणना भाषा के रूप में बेहतर अनुकूल है। वर्कअराउंड में शुद्ध बैश में एक अद्भुत 300-लाइन कैलकुलेटर, या बैश में let कमांड, या tcsh में @ कमांड शामिल है।
> @ n = ( 1 + 1 / 2 )
> echo $n
1
बहुत जटिल गणित के लिए, bc या एक अच्छी पायथन गणित लाइब्रेरी सीखना उचित हो सकता है।
सभी अनिवार्यताएं
मेरे लिए, tcsh स्पष्ट सादगी और आवश्यक सुविधाओं के बीच एक आदर्श संतुलन बनाता है। यह सभी उपयोगकर्ताओं के लिए, या सभी उद्देश्यों के लिए भी एक शेल नहीं है, लेकिन यदि आप अपने टेक्स्ट-आधारित दुनिया के दृष्टिकोण को सरल बनाने की तलाश में हैं, तो tcsh एक दिलचस्प विकल्प प्रदान कर सकता है।