Fish 2.7



fish

Documentation

परिचय

यह fish , दोस्ताना इंटरैक्टिव खोल के लिए प्रलेखन है। fish एक उपयोगकर्ता के अनुकूल कमांडलाइन खोल है जिसका उद्देश्य ज्यादातर इंटरैक्टिव उपयोग के लिए होता है। एक खोल एक प्रोग्राम है जो अन्य कार्यक्रमों को निष्पादित करने के लिए उपयोग किया जाता है। fish पर नवीनतम जानकारी के लिए, कृपया fish मुखपृष्ठ पर जाएं

सिंटेक्स सिंहावलोकन

मछलियों की तरह शैल उन्हें आदेश देकर उपयोग किया जाता है। प्रत्येक fish कमांड एक ही सरल वाक्यविन्यास का पालन करता है।

आदेश के नाम को किसी भी तर्क के बाद लिखकर एक आदेश निष्पादित किया जाता है।

उदाहरण:

echo hello world

यह echo कमांड को कॉल करता है। echo एक कमांड है जो स्क्रीन पर अपने तर्क लिख देगा। उपर्युक्त उदाहरण में, आउटपुट 'हैलो वर्ल्ड' होगा। मछली में सब कुछ आदेशों के साथ किया जाता है। आदेशों का एक सेट कई बार करने के लिए आदेश हैं, चर निर्दिष्ट करने के लिए कमांड, आदेशों के समूह को एकल कमांड के रूप में उपयोग करने के लिए आदेश, आदि .. और प्रत्येक एकल कमांड एक ही सरल वाक्यविन्यास का पालन करता है।

यदि आप ऊपर इस्तेमाल किए गए इको कमांड के बारे में और जानना चाहते हैं, तो echo कमांड के लिए मैन्युअल पेज को लिखकर पढ़ें: man echo

man किसी दिए गए विषय पर मैन्युअल पृष्ठ प्रदर्शित करने के लिए एक आदेश है। मैन कमांड मैन्युअल पेज का नाम तर्क के रूप में प्रदर्शित करने के लिए लेता है। अधिकांश कंप्यूटरों पर लगभग हर कमांड के लिए मैन्युअल पेज हैं। कई अन्य चीजों के लिए मैन्युअल पेज भी हैं, जैसे सिस्टम लाइब्रेरीज़ और महत्वपूर्ण फाइलें।

आपके कंप्यूटर पर हर कार्यक्रम को fish में कमांड के रूप में इस्तेमाल किया जा सकता है। यदि प्रोग्राम फ़ाइल PATH में निर्देशिकाओं में से एक में स्थित है, तो इसका उपयोग करने के लिए प्रोग्राम का नाम टाइप करना पर्याप्त है। अन्यथा निर्देशिका सहित सभी फ़ाइल नाम (जैसे /home/me/code/checkers/checkers या ../checkers ) का उपयोग किया जाना चाहिए।

यहां कुछ उपयोगी आदेशों की एक सूची दी गई है:

  • cd , वर्तमान निर्देशिका बदलें
  • ls , सूची फाइलों और निर्देशिकाओं
  • man , स्क्रीन पर एक मैनुअल पेज प्रदर्शित करें
  • mv , चाल (नाम बदलें) फ़ाइलें
  • cp , फाइल कॉपी करें
  • प्रत्येक फ़ाइल प्रकार से जुड़े डिफ़ॉल्ट अनुप्रयोग के साथ खुली फ़ाइलें खोलें
  • less , फाइलों की सामग्री सूचीबद्ध करें

कमांड और पैरामीटर स्पेस कैरेक्टर '' से अलग होते हैं। प्रत्येक आदेश या तो एक नई लाइन के साथ समाप्त होता है (यानी रिटर्न कुंजी दबाकर) या अर्धविराम ' ; '। अर्धविराम से अलग करके एक ही पंक्ति पर एक से अधिक कमांड लिखे जा सकते हैं।

एक स्विच एक बहुत ही आम विशेष प्रकार का तर्क है। स्विच लगभग हमेशा एक या अधिक हाइफ़न ' - ' से शुरू होते हैं और कमांड संचालित करने के तरीके को बदलते हैं। उदाहरण के लिए, ' ls ' कमांड आमतौर पर मौजूदा कार्यशील निर्देशिका में सभी फ़ाइलों और निर्देशिकाओं को सूचीबद्ध करता है, लेकिन ' -l ' स्विच का उपयोग करके, ' ls ' का व्यवहार न केवल फ़ाइल नाम प्रदर्शित करने के लिए बदला जाता है, बल्कि आकार भी , प्रत्येक फ़ाइल के अनुमति, मालिक और संशोधन समय।

स्विच कमांड के बीच भिन्न होते हैं और प्रत्येक कमांड के लिए मैन्युअल पेज में दस्तावेज होते हैं। हालांकि कुछ स्विच अधिकांश कमांड के लिए आम हैं, उदाहरण के लिए ' --help ' आमतौर पर एक सहायता टेक्स्ट प्रदर्शित करेगा, ' -i ' अक्सर कार्रवाई करने से पहले इंटरैक्टिव प्रॉम्प्टिंग चालू कर देगा, जबकि ' -f ' इसे बंद कर देगा।

उद्धरण

कभी-कभी पैरामीटर विस्तार और चरित्र से बचने जैसी विशेषताएं रास्ते में आती हैं। जब ऐसा होता है, तो उपयोगकर्ता उद्धरण के भीतर पैरामीटर लिख सकता है, या तो ' (एकल उद्धरण) या " (डबल कोट)। एकल उद्धृत और डबल उद्धृत तारों के बीच एक महत्वपूर्ण अंतर है: डबल उद्धृत स्ट्रिंग का उपयोग करते समय, परिवर्तनीय विस्तार अभी भी होता है इसके अलावा, कोई अन्य प्रकार का विस्तार ( ब्रेस विस्तार और पैरामीटर विस्तार सहित) नहीं होगा, पैरामीटर में रिक्त स्थान हो सकते हैं, और भागने के दृश्यों को अनदेखा कर दिया जाता है। सिंगल कोट्स के भीतर स्वीकार किया जाने वाला एकमात्र बैकस्लैश एस्केप \' , जो एकल से बचता है उद्धरण और \\ , जो बैकस्लैश प्रतीक से बच निकलता है। डबल कोट्स के भीतर स्वीकार किए जाने वाले एकमात्र बैकस्लैश भागने \" , जो एक डबल कोट, \$ से बच निकलता है, जो एक डॉलर के चरित्र से बचता है, उसके बाद बैकस्लैश हटा देता है और न्यूलाइन, और आखिरकार \\ , जो बैकस्लैश प्रतीक से बच निकलता है। सिंगल कोट्स का डबल कोट्स के विपरीत कोई विशेष अर्थ नहीं है और इसके विपरीत।

उदाहरण:

rm "cumbersome filename.txt"

फ़ाइल को 'cumbersome filename.txt' हटा देगा, जबकि

rm cumbersome filename.txt

दो फाइलों 'बोझिल' और 'filename.txt' को हटा देगा।

अक्षर से बचना

कुछ पात्र सीधे कमांड लाइन पर नहीं लिखे जा सकते हैं। इन पात्रों के लिए, तथाकथित बचने के दृश्य प्रदान किए जाते हैं। य़े हैं:

  • ' \a ' चेतावनी चरित्र का प्रतिनिधित्व करता है
  • ' \b ' बैकस्पेस चरित्र का प्रतिनिधित्व करता है
  • ' \e ' बचने वाले चरित्र का प्रतिनिधित्व करता है
  • ' \f ' फॉर्म फीड कैरेक्टर का प्रतिनिधित्व करता है
  • ' \n ' एक न्यूलाइन चरित्र का प्रतिनिधित्व करता है
  • ' \r ' कैरिज रिटर्न कैरेक्टर का प्रतिनिधित्व करता है
  • ' \t ' टैब वर्ण का प्रतिनिधित्व करता है
  • ' \v ' लंबवत टैब वर्ण का प्रतिनिधित्व करता है
  • ' \ ' अंतरिक्ष चरित्र से बच निकला
  • ' \$ ' डॉलर के चरित्र से बच निकला
  • ' \\ ' बैकस्लैश चरित्र से बच निकला
  • ' \* ' स्टार चरित्र से बच निकला
  • ' \? 'प्रश्न चिह्न चरित्र से बच निकला
  • ' \~ ' tilde चरित्र से बच निकला
  • ' \% ' प्रतिशत चरित्र से बच निकला
  • ' \# ' हैश चरित्र से बच निकला
  • ' \( ' बाएं कोष्ठक चरित्र से बच निकलता है
  • ' \) ' सही कोष्ठक चरित्र से बच निकला है
  • ' \{ ' बाएं घुंघराले ब्रैकेट चरित्र से बच निकलता है
  • ' \} ' सही घुंघराले ब्रैकेट चरित्र से बच निकलता है
  • ' \[ ' बाएं ब्रैकेट चरित्र से बच निकला
  • ' \] ' सही ब्रैकेट चरित्र से बच निकला
  • ' \< ' चरित्र से कम से बच निकलता है
  • ' \> ' चरित्र से अधिक से बच निकलता है
  • ' \^ ' circumflex चरित्र से बच निकला
  • ' \& ' ampersand चरित्र से बच निकला
  • ' \| 'लंबवत बार चरित्र से बच निकला
  • ' \; 'अर्धविराम चरित्र से बच निकला
  • ' \" ' उद्धरण चरित्र से बच निकला
  • ' \' 'एस्ट्रोफ़े चरित्र से बच निकला
  • ' \x xx ', जहां xx हेक्साडेसिमल संख्या है, निर्दिष्ट मान के साथ एएससीआई वर्ण का प्रतिनिधित्व करता है। उदाहरण के लिए, \x9 टैब वर्ण है।
  • ' \X xx ', जहां xx हेक्साडेसिमल संख्या है, निर्दिष्ट मान के साथ डेटा के बाइट का प्रतिनिधित्व करता है। यदि आप मल्टीबाइट एन्कोडिंग का उपयोग कर रहे हैं, तो इसका उपयोग अमान्य तारों में प्रवेश करने के लिए किया जा सकता है। अगर आप जानते हैं कि आप क्या कर रहे हैं तो केवल इसका इस्तेमाल करें।
  • ' \ ooo ', जहां ooo एक ऑक्टल संख्या है, निर्दिष्ट मान के साथ ascii वर्ण का प्रतिनिधित्व करता है। उदाहरण के लिए, \011 टैब वर्ण है।
  • ' \u xxxx ', जहां xxxx हेक्साडेसिमल संख्या है, निर्दिष्ट मान के साथ 16-बिट यूनिकोड वर्ण का प्रतिनिधित्व करता है। उदाहरण के लिए, \u9 टैब वर्ण है।
  • ' \U xxxxxxxx ', जहां xxxxxxxx एक हेक्साडेसिमल संख्या है, निर्दिष्ट मान के साथ 32-बिट यूनिकोड वर्ण का प्रतिनिधित्व करता है। उदाहरण के लिए, \U9 टैब वर्ण है।
  • ' \c x ', जहां x वर्णमाला का एक अक्षर है, नियंत्रण कुंजी और निर्दिष्ट अक्षर दबाकर उत्पन्न नियंत्रण अनुक्रम का प्रतिनिधित्व करता है। उदाहरण के लिए, \ci टैब वर्ण है

इनपुट / आउटपुट (आईओ) पुनर्निर्देशन

अधिकांश कार्यक्रम तीन इनपुट / आउटपुट (आईओ) धाराओं का उपयोग करते हैं, प्रत्येक को फ़ाइल डिस्क्रिप्टर (एफडी) नामक संख्या द्वारा दर्शाया जाता है। य़े हैं:

  • मानक इनपुट, एफडी 0, पढ़ने के लिए, कीबोर्ड से पढ़ने के लिए डिफ़ॉल्ट।
  • मानक आउटपुट, एफडी 1, लेखन के लिए, स्क्रीन पर लिखने के लिए डिफ़ॉल्ट।
  • त्रुटियों और चेतावनियों को लिखने के लिए मानक त्रुटि, एफडी 2, स्क्रीन पर लिखने के लिए डिफ़ॉल्ट।

दो आउटपुट फ़ाइल डिस्क्रिप्टर प्रदान करने का कारण नियमित प्रोग्राम आउटपुट से त्रुटियों और चेतावनियों को अलग करना है।

किसी भी फ़ाइल डिस्क्रिप्टर को एक रीडायरेक्शन नामक एक साधारण तंत्र के माध्यम से अपने डिफ़ॉल्ट से अलग आउटपुट पर निर्देशित किया जा सकता है।

फ़ाइल पुनर्निर्देशन का एक उदाहरण echo hello > output.txt , जो echo कमांड के आउटपुट को output echo hello > output.txt निर्देशित करता है।

  • फ़ाइल से मानक इनपुट पढ़ने के लिए, <SOURCE_FILE लिखें
  • फ़ाइल में मानक आउटपुट लिखने के लिए, >DESTINATION लिखें
  • फ़ाइल में मानक त्रुटि लिखने के लिए, ^DESTINATION लिखें
  • फ़ाइल में मानक आउटपुट जोड़ने के लिए, >>DESTINATION_FILE लिखें
  • फ़ाइल में मानक त्रुटि को जोड़ने के लिए, ^^DESTINATION_FILE लिखें
  • किसी मौजूदा फ़ाइल को ओवरराइट ("क्लॉबर") ओवरराइट करने के लिए, '>? DESTINATION' या '^? DESTINATION' लिखें

DESTINATION निम्नलिखित में से एक हो सकता है:

  • एक फ़ाइल नाम। आउटपुट निर्दिष्ट फ़ाइल में लिखा जाएगा।
  • एक एम्पर्सेंड ( & ) एक और फ़ाइल डिस्क्रिप्टर की संख्या के बाद। आउटपुट इसके बजाय उस फ़ाइल डिस्क्रिप्टर को लिखा जाएगा।
  • एक एम्पर्सेंड के बाद एक ऋण चिह्न ( &- )। फाइल डिस्क्रिप्टर बंद हो जाएगा।

उदाहरण:

फ़ाइल 'all_output.txt' फ़ाइल में मानक आउटपुट और मानक त्रुटि दोनों को पुनर्निर्देशित करने के लिए, आप echo Hello > all_output.txt ^&1 लिख सकते हैं।

फाइल डिस्क्रिप्टर के साथ पुनर्निर्देशन को उपसर्ग करके किसी फ़ाइल डिस्क्रिप्टर को मनमाने ढंग से रीडायरेक्ट किया जा सकता है।

  • एफडी एन के इनपुट को रीडायरेक्ट करने के लिए, N<DESTINATION लिखें
  • एफडी एन के आउटपुट को रीडायरेक्ट करने के लिए, N>DESTINATION लिखें
  • फ़ाइल में एफडी एन के आउटपुट को जोड़ने के लिए, N>>DESTINATION_FILE लिखें

उदाहरण: echo Hello 2>output.stderr और echo Hello ^output.stderr समकक्ष हैं, और output.stderr लक्ष्य प्रोग्राम की मानक त्रुटि (फ़ाइल वर्णनकर्ता 2) output.stderr

पाइपलाइन

उपयोगकर्ता एकाधिक आदेशों को एक तथाकथित पाइपलाइन में स्ट्रिंग कर सकता है। इसका मतलब है कि एक कमांड का मानक आउटपुट अगले कमांड में मानक इनपुट के रूप में पढ़ा जाएगा। यह पाइप चरित्र 'द्वारा कमांड को अलग करके किया जाता है '। उदाहरण के लिए

cat foo.txt | head

cat प्रोग्राम को 'foo.txt' पैरामीटर के साथ कॉल करेगा, जो फ़ाइल 'foo.txt' की सामग्री मुद्रित करेगा। Foo.txt की सामग्री को प्रोग्राम 'हेड' के माध्यम से फ़िल्टर किया जाएगा, जो स्क्रीन पर फ़ाइल की पहली दस पंक्तियों को पार करेगा। पाइप के माध्यम से कमांड को गठबंधन करने के तरीके के बारे में अधिक जानकारी के लिए, man कमांड का उपयोग करके उन आदेशों के मैन्युअल पेज पढ़ें जिन्हें आप उपयोग करना चाहते हैं। यदि आप cat कार्यक्रम के बारे में और जानना चाहते हैं, तो man cat टाइप करें।

पाइप आमतौर पर दूसरी प्रक्रिया के डिस्क्रिप्टर 0 (मानक इनपुट) फ़ाइल करने के लिए पहली प्रक्रिया के फ़ाइल डिस्क्रिप्टर 1 (मानक आउटपुट) को कनेक्ट करते हैं। यह वांछित एफडी संख्या तैयार करके और फिर पाइप पर आउटपुट रीडायरेक्ट प्रतीक द्वारा एक अलग आउटपुट फ़ाइल डिस्क्रिप्टर का उपयोग संभव है। उदाहरण के लिए:

make fish 2>| less

मछली कार्यक्रम बनाने का प्रयास करेगा, और कम पेजर का उपयोग करके कोई भी त्रुटि दिखाई देगी।

पृष्ठभूमि नौकरियां

जब आप fish में नौकरी शुरू करते हैं, तो fish खुद ही रुक जाएगी, और कार्यक्रम के लिए टर्मिनल पर नियंत्रण देना शुरू हो जाएगा। कभी-कभी, आप कमांडलाइन का उपयोग करना जारी रखना चाहते हैं, और पृष्ठभूमि में नौकरी चलाएं। पृष्ठभूमि नौकरी बनाने के लिए, अपने आदेश में एक & (ampersand) संलग्न करें। यह पृष्ठभूमि में नौकरी चलाने के लिए मछली को बताएगा। ग्राफ़िकल यूजर इंटरफेस वाले प्रोग्राम चलाने पर पृष्ठभूमि नौकरियां बहुत उपयोगी होती हैं।

उदाहरण:

emacs &

पृष्ठभूमि में emacs पाठ संपादक शुरू करेंगे।

नौकरी नियंत्रण

अधिकांश कार्यक्रम आपको प्रोग्राम के निष्पादन को निलंबित करने और नियंत्रण - जेड (जिसे ^Z भी कहा जाता है) दबाकर fish पर नियंत्रण वापस करने की अनुमति देते हैं। एक बार वापस fish कमांडलाइन पर, आप अन्य कार्यक्रम शुरू कर सकते हैं और जो कुछ भी आप चाहते हैं उसे कर सकते हैं। यदि आप चाहते हैं तो आप fg (अग्रभूमि) कमांड का उपयोग करके निलंबित आदेश पर वापस जा सकते हैं।

यदि आप पृष्ठभूमि में निलंबित नौकरी डालना चाहते हैं, तो bg कमांड का उपयोग करें।

वर्तमान में शुरू की गई सभी नौकरियों की सूची प्राप्त करने के लिए, jobs कमांड का उपयोग करें।

कार्य

फ़ंक्शन सिंटैक्स में लिखे गए प्रोग्राम हैं। वे एक या एक से अधिक आदेशों और उनके तर्कों को एक ही नाम का उपयोग करके समूहबद्ध करते हैं। इसका उपयोग अतिरिक्त तर्कों के साथ एक विशिष्ट कमांड शुरू करने के लिए भी किया जा सकता है।

उदाहरण के लिए, निम्नलिखित एक फ़ंक्शन परिभाषा है जो वर्तमान निर्देशिका की सामग्री की विस्तृत सूची मुद्रित करने के लिए ' -l ' तर्क के साथ कमांड को कॉल करती है:

function ll
    ls -l $argv
end

पहली पंक्ति मछली को बताती है कि ll के नाम से एक कार्य परिभाषित किया जाना है। इसका उपयोग करने के लिए, कमांडलाइन पर बस लिखें। दूसरी पंक्ति मछली को बताती है कि कमांड ls -l $argv को बुलाया जाना चाहिए जब ll आह्वान किया जाता है। ' $argv ' एक सरणी चर है, जिसमें हमेशा फ़ंक्शन पर भेजे गए सभी तर्क शामिल होते हैं। ऊपर दिए गए उदाहरण में, ये बस ls कमांड पर पास हो जाते हैं। कार्यों के बारे में अधिक जानकारी के लिए, बिल्टिन function लिए दस्तावेज़ देखें।

उपनाम परिभाषित करना

कार्यों के लिए सबसे आम उपयोगों में से एक है कि पहले से मौजूद कमांड के व्यवहार को थोड़ा सा बदलना है। उदाहरण के लिए, कोई रंग प्रदर्शित करने के लिए ls कमांड को फिर से परिभाषित करना चाहता है। जीएनयू सिस्टम पर रंग बदलने के लिए स्विच ' --color=auto ' है। एक उपनाम, या रैपर, ls आसपास इस तरह दिख सकता है:

function ls
    command ls --color=auto $argv
end

कुछ महत्वपूर्ण चीजें हैं जिन्हें उपनामों के बारे में ध्यान देने की आवश्यकता है:

  • हमेशा $argv कमांड पर पैरामीटर की सूची में $argv चर जोड़ने के लिए सावधानी बरतें। यह सुनिश्चित करता है कि यदि उपयोगकर्ता फ़ंक्शन में कोई अतिरिक्त पैरामीटर निर्दिष्ट करता है, तो वे अंतर्निहित कमांड पर जाते हैं।
  • यदि उपनाम के पास उपनाम कमांड के समान नाम है, तो प्रोग्राम को कॉल को प्रीफिक्स करना आवश्यक है ताकि मछली को यह बताने के लिए कि फ़ंक्शन को स्वयं कॉल नहीं करना चाहिए, बल्कि एक ही नाम के साथ एक आदेश है। ऐसा करने में विफल असीमित रिकर्सन बग का कारण बन जाएगा।
  • Autoloading उपनामों पर लागू नहीं है। चूंकि, परिभाषा के अनुसार, फ़ंक्शन तब बनाया जाता है जब उपनाम आदेश निष्पादित किया जाता है। आप उपनामों को स्वत: लोड नहीं कर सकते हैं।

आसानी से इस फ़ॉर्म का एक फ़ंक्शन बनाने के लिए, आप alias कमांड का उपयोग कर सकते हैं।

स्वत: लोडिंग कार्यों

कार्यों को कमांडलाइन या कॉन्फ़िगरेशन फ़ाइल में परिभाषित किया जा सकता है, लेकिन उन्हें स्वचालित रूप से लोड भी किया जा सकता है। कार्यों को परिभाषित करने की इस विधि में कई फायदे हैं। एक ऑटोलोडेड फ़ंक्शन स्वचालित रूप से सभी चलने वाले गोले में उपलब्ध हो जाता है। यदि फ़ंक्शन परिभाषा बदल दी गई है, तो सभी चल रहे गोले स्वचालित रूप से परिवर्तित संस्करण को पुनः लोड कर देंगे। स्टार्टअप समय और मेमोरी उपयोग में सुधार हुआ है, आदि

मछली स्वचालित रूप से सरणी चर $fish_function_path में किसी भी निर्देशिका के माध्यम से $fish_function_path , और परिभाषित किए गए किसी भी फ़ंक्शन को स्वचालित रूप से लोड होने पर स्वचालित रूप से लोड किया जाता है। फ़ंक्शन परिभाषा फ़ाइल में फ़ाइल नाम होना चाहिए जिसमें फ़ंक्शन का नाम और प्रत्यय ' .fish ' शामिल होना चाहिए।

डिफ़ॉल्ट रूप से, मछली पहले उपलब्ध फ़ाइल का उपयोग करके फ़ंक्शंस के लिए निम्न की खोज करती है:

  • अंत उपयोगकर्ताओं को अपने स्वयं के कार्यों को रखने के लिए एक निर्देशिका, आमतौर पर ~/.config/fish/functions ( XDG_CONFIG_HOME पर्यावरण चर द्वारा नियंत्रित)।
  • सिस्टम प्रशासकों के लिए सिस्टम पर सभी उपयोगकर्ताओं के लिए कार्यों को स्थापित करने के लिए एक निर्देशिका, आमतौर पर /etc/fish/functions
  • तृतीय-पक्ष सॉफ़्टवेयर विक्रेताओं के लिए एक निर्देशिका उनके सॉफ़्टवेयर के लिए अपने स्वयं के फ़ंक्शंस भेजने के लिए, आमतौर पर /usr/share/fish/vendor_functions.d
  • मछली के साथ भेजे गए कार्यों, आमतौर पर /usr/share/fish/functions

इन पथों को बिल्ड, स्थापित, या रन टाइम पर सेट पैरामीटर द्वारा नियंत्रित किया जाता है, और ऊपर सूचीबद्ध डिफ़ॉल्ट से भिन्न हो सकते हैं।

यह व्यापक खोज भ्रमित हो सकती है। यदि आप अनिश्चित हैं, तो आपके कार्य शायद ~/.config/fish/functions

यह बहुत महत्वपूर्ण है कि फ़ंक्शन परिभाषा फ़ाइलों में केवल निर्दिष्ट फ़ंक्शन की परिभाषा होती है और कुछ भी नहीं। अन्यथा, यह संभव है कि फ़ंक्शन फ़ाइलों को स्वत: लोड करने की आवश्यकता हो कि फ़ंक्शन पहले ही लोड हो, जो एक परिपत्र निर्भरता बनाता है।

Autoloading भी ईवेंट हैंडलर के लिए काम नहीं करेगा, क्योंकि मछली यह नहीं जान सकती है कि जब कोई फ़ंक्शन अभी तक लोड नहीं होता है तो कोई फ़ंक्शन निष्पादित किया जाता है। अधिक जानकारी के लिए ईवेंट हैंडलर अनुभाग देखें।

Autoloading alias आदेश द्वारा बनाए गए कार्यों पर लागू नहीं है। कार्यों के लिए पर्याप्त सरल है कि आप उन्हें परिभाषित करने के लिए alias कमांड का उपयोग करना पसंद करते हैं, आपको उन आदेशों को अपने ~/.config/fish/config.fish स्क्रिप्ट या खोल शुरू होने पर चलाने वाली कुछ अन्य स्क्रिप्ट में ~/.config/fish/config.fish

यदि आप एक और प्रोग्राम विकसित कर रहे हैं, तो आप एक ऐसे सिस्टम को स्थापित करना चाहेंगे जो सिस्टम पर मछली खोल के सभी उपयोगकर्ताओं के लिए उपलब्ध हो। उन्हें "विक्रेता" फ़ंक्शंस निर्देशिका में स्थापित किया जा सकता है। चूंकि यह पथ सिस्टम से सिस्टम में भिन्न हो सकता है, pkgconfig ढांचे का उपयोग pkg-config --variable functionsdir fish के आउटपुट के साथ इस पथ को खोजने के लिए किया जाना चाहिए।

कोड और प्रवाह नियंत्रण की सशर्त निष्पादन

चार मछली निर्मित हैं जो आपको केवल तभी निष्पादित करने देते हैं जब कोई विशिष्ट मानदंड पूरा हो। ये अंतर्निहित हैं if switch , and , or

switch कमांड का उपयोग स्ट्रिंग के मान के आधार पर आदेशों के संभवतः कई ब्लॉक को निष्पादित करने के लिए किया जाता है। अधिक जानकारी के लिए switch लिए प्रलेखन देखें।

अन्य कंडीशनर यह तय करने के लिए कमांड की निकास स्थिति का उपयोग करते हैं कि कमांड या कमांड का ब्लॉक निष्पादित किया जाना चाहिए या नहीं। if , and और अधिक जानकारी के लिए प्रलेखन देखें।

कुछ आम शब्द

यह मछली में आमतौर पर इस्तेमाल किए जाने वाले कुछ शब्दों का संक्षिप्त विवरण है।

  • कमांड को दिए गए पैरामीटर को तर्क दें
  • खोल में लागू एक आदेश बनाया गया है। बिल्टिन कमांड हैं जो कि खोल से इतनी बारीकी से बंधे हैं कि बाहरी आदेशों के रूप में उन्हें लागू करना असंभव है।
  • एक प्रोग्राम कमांड करें जो खोल चला सकता है।
  • आदेशों का एक ब्लॉक कार्य करें जिसे कहा जा सकता है जैसे कि वे एक ही कमांड थे। फ़ंक्शंस का उपयोग करके, एक से अधिक छोटे कमांड को एक और उन्नत कमांड में स्ट्रिंग करना संभव है।
  • नौकरी पाइपलाइन या कमांड नौकरी
  • पाइपलाइन एक साथ स्ट्रिंग किए गए कमांड का एक सेट ताकि एक कमांड का आउटपुट अगले कमांड का इनपुट हो
  • एक ऑपरेशन पुनर्निर्देशन जो नौकरी से जुड़े इनपुट / आउटपुट धाराओं में से एक को बदलता है
  • आदेश के तर्क के रूप में भेजे गए एक विशेष ध्वज को स्विच करें जो कमांड के व्यवहार को बदल देगा। एक स्विच लगभग हमेशा एक या दो हाइफ़न से शुरू होता है।

मदद

fish में एक व्यापक सहायता प्रणाली है। किसी विशिष्ट विषय या आदेश पर सहायता प्राप्त करने के लिए help आदेश का उपयोग करें। उदाहरण के लिए, लेखन help syntax लेखन इस दस्तावेज़ के वाक्यविन्यास खंड प्रदर्शित करता है।

fish आदेशों के लिए मैन पेज भी हैं। उदाहरण के लिए, man set एक मैन पेज के रूप में set लिए प्रलेखन दिखाएगा।

एक विशिष्ट बिल्टिन पर सहायता -h पैरामीटर के साथ भी प्राप्त की जा सकती है। उदाहरण के लिए, fg बिल्टिन पर सहायता प्राप्त करने के लिए, या तो fg -h टाइप fg -h या help fg

स्वतः सुझाव

आदेश कमांड इतिहास, समापन, और वैध फ़ाइल पथ के आधार पर आपके द्वारा टाइप किए जाने वाले आदेशों को सुझाता है। जैसे ही आप कमांड टाइप करते हैं, आपको कर्सर के बाद एक म्यूट ग्रे ग्रे रंग में दिया गया सुझाव दिखाई देगा (जिसे fish_color_autosuggestion चर के साथ बदला जा सकता है)।

स्वत: सुझाव (आदेश पंक्ति सामग्री को बदलने) को स्वीकार करने के लिए, दायां तीर या नियंत्रण - एफ दबाएं। पहले सुझाए गए शब्द को स्वीकार करने के लिए, Alt - या Alt - F दबाएं। यदि स्वत: सुझाव वह नहीं है जो आप चाहते हैं, तो बस इसे अनदेखा करें: जब तक आप इसे स्वीकार नहीं करेंगे तब तक यह निष्पादित नहीं होगा।

पहले कुछ वर्ण टाइप करके स्वचालित रूप से अक्सर दर्ज किए गए आदेशों को बुलाए जाने के लिए स्वत: सुझाव एक शक्तिशाली तरीका हैं। वे निर्देशिका पदानुक्रमों के माध्यम से नेविगेट करने के लिए भी एक कुशल तकनीक हैं।

टैब पूरा करना

टैब पूर्णता किसी भी आधुनिक खोल की सबसे अधिक बचत सुविधाओं में से एक है। टैब कुंजी टैप करके, उपयोगकर्ता fish को उस शेष आदेश या पैरामीटर का अनुमान लगाने के लिए कहता है जिसे उपयोगकर्ता वर्तमान में टाइप कर रहा है। अगर fish केवल एक संभावित पूरा हो सकती है, तो fish इसे लिख देगी। यदि एक से अधिक पूरा होने पर, fish सबसे लंबे समय तक उपसर्ग लिखती है कि सभी समापन सामान्य हैं। यदि पूरा चरित्र पहले पूर्णता पर भिन्न होता है, तो सभी संभावित समापन की एक सूची मुद्रित होती है। सूची में पूर्णता के विवरण शामिल हैं और यदि सूची स्क्रीन पर फिट नहीं होती है, तो तीर कुंजी, पेज अप / पेज डाउन कुंजियों, टैब कुंजी या स्पेस बार का उपयोग करके स्क्रॉल करने योग्य है। एक बार सूची दर्ज हो जाने के बाद, कोई अन्य कुंजी दबाने से एक खोज शुरू हो जाएगी। यदि सूची दर्ज नहीं की गई है, तो कोई अन्य कुंजी दबाकर सूची से बाहर निकलेंगे और दबाए गए कुंजी को कमांड लाइन में डालेंगे।

ये सामान्य प्रयोजन टैब पूर्णताएं हैं जो fish प्रदान करती हैं:

  • आदेशों का समापन (बिल्टिन, कार्य और नियमित कार्यक्रम)।
  • खोल परिवर्तनीय नामों का समापन।
  • टिल्ड विस्तार के लिए उपयोगकर्ता नामों का समापन।
  • फ़ाइल नामों को पूरा करना, यहां तक ​​कि ' * ', ' ** ' और 'जैसे वाइल्डकार्ड के साथ तारों पर भी ? '।
  • प्रक्रिया विस्तार के लिए नौकरी आईडी, नौकरी का नाम और प्रक्रिया नाम पूरा करना।

fish कार्यक्रम विशिष्ट समापन की एक बड़ी संख्या प्रदान करता है। इनमें से अधिकतर समापन सरल विकल्प हैं जैसे ls लिए विकल्प, लेकिन कुछ अधिक उन्नत हैं। उत्तरार्द्ध में शामिल हैं:

  • प्रोग्राम man और whatis सभी स्थापित मैन्युअल पृष्ठों को पूरा होने के रूप में दिखाते हैं।
  • मेकफाइल वर्तमान मेकफ़ाइल में पूरा लक्ष्य के रूप में सभी लक्ष्यों का उपयोग करता है।
  • mount कमांड fstab में निर्दिष्ट सभी माउंट पॉइंट्स को पूर्णता के रूप में उपयोग करता है।
  • ssh कमांड उन सभी होस्टों का उपयोग करता है जो ज्ञात_होस्ट फ़ाइल में पूर्ण होने के रूप में संग्रहीत हैं। (अधिक जानकारी के लिए एसएसएच दस्तावेज देखें)
  • su कमांड सिस्टम पर सभी उपयोगकर्ताओं को पूर्णता के रूप में उपयोग करता है।
  • apt-get yum , rpm और yum कमांड सभी स्थापित पैकेजों को पूर्णता के रूप में उपयोग करते हैं।

अपनी खुद की समाप्ति लिखना

अपने स्वयं के पूरा होने को निर्दिष्ट करना मुश्किल नहीं है। पूरा करने के लिए, complete आदेश का उपयोग करें। पैरामीटर के रूप में पूर्णता निर्दिष्ट करने के लिए कमांड का नाम लेता है। उदाहरण के लिए, प्रोग्राम myprog लिए पूरा करने के लिए, एक complete -c myprog ... साथ पूर्णता आदेश शुरू होगा complete -c myprog ...

Myprog के लिए संभावित पूर्णता की एक सूची प्रदान करने के लिए, -a स्विच का उपयोग करें। अगर myprog तर्कों को शुरू और बंद कर देता है, तो इसे complete -c myprog -a 'start stop' रूप में निर्दिष्ट किया जा सकता है। -a स्विच के लिए तर्क हमेशा एक स्ट्रिंग है। पूरा होने पर, इसे रिक्त स्थान और टैब पर टोकननाइज़ किया जाएगा, और परिवर्तनीय विस्तार, कमांड प्रतिस्थापन और पैरामीटर विस्तार के अन्य रूप होंगे।

एक आदेश द्वारा स्वीकार किए गए स्विच निर्दिष्ट करने के लिए fish का एक विशेष वाक्यविन्यास होता है। स्विच -s , -l और -o का उपयोग एक छोटा स्विच (एकल वर्ण, जैसे -l ) निर्दिष्ट करने के लिए किया जाता है, एक gnu शैली लंबा स्विच (जैसे ' --color ') और पुरानी शैली के लंबे स्विच (जैसे क्रमशः ' -shuffle ')। यदि 'myprog' कमांड में '-o' विकल्प है जिसे ' --output ' के रूप में भी लिखा जा सकता है, और जो 'हां' या 'नहीं' का अतिरिक्त मूल्य ले सकता है, तो इसे लिखित द्वारा निर्दिष्ट किया जा सकता है:

complete -c myprog -s o -l output -a "yes no"

यह निर्दिष्ट करने के लिए विशेष स्विच भी हैं कि एक स्विच के लिए फ़ाइल नाम पूर्ण करने के लिए एक तर्क की आवश्यकता होती है, जो केवल कुछ संयोजनों में उपलब्ध होने वाले पूर्णताएं बनाने के लिए .. complete आदेश द्वारा स्वीकार किए गए विभिन्न स्विचों के पूर्ण विवरण के लिए, दस्तावेज़ देखें complete निर्मित के लिए, या fish खोल के अंदर complete --help लिखें।

अपने जटिल समापन को लिखने के उदाहरणों के लिए, /usr/share/fish/completions में पूर्णता का अध्ययन करें। (सटीक पथ आपके चुने हुए इंस्टॉलेशन उपसर्ग पर निर्भर करता है और थोड़ा अलग हो सकता है)

पूरा करने के लिए उपयोगी कार्यों

कई जहाजों के साथ fish जहाजों जो कमांड विशिष्ट समापन लिखते समय बहुत उपयोगी हैं। इनमें से अधिकतर फ़ंक्शन का नाम स्ट्रिंग ' __fish_ ' से शुरू होता है। इस तरह के कार्य fish लिए आंतरिक हैं और उनके नाम और इंटरफेस भविष्य के मछली संस्करणों में बदल सकते हैं। फिर भी, पूरा होने पर उनमें से कुछ बहुत उपयोगी हो सकते हैं। इनमें से कुछ कार्यों का वर्णन यहां किया गया है। ध्यान रखें कि उन्हें मछली के भविष्य के संस्करणों में हटाया या बदला जा सकता है।

स्ट्रिंग के साथ शुरू होने वाले कार्य __fish_print_ स्ट्रिंग की एक नई __fish_print_ अलग सूची मुद्रित करें। उदाहरण के लिए, __fish_print_filesystems सभी ज्ञात फ़ाइल सिस्टम की एक सूची मुद्रित करता है। __fish_complete_ शुरू होने वाले फ़ंक्शंस विवरण के साथ पूर्णता की एक नई __fish_complete_ अलग सूची मुद्रित करें। वर्णन एक टैब चरित्र द्वारा पूरा होने से अलग किया गया है।

  • __fish_complete_directories STRING DESCRIPTION पर पथ पूर्णता निष्पादित करता है, केवल निर्देशिकाओं को अनुमति देता है, और उन्हें वर्णन विवरण देता है।
  • __fish_complete_path STRING DESCRIPTION पर पथ पूर्णता करता है, उन्हें वर्णन विवरण देता है।
  • __fish_complete_groups समूह के सदस्यों के साथ विवरण के रूप में सभी उपयोगकर्ता समूहों की एक सूची मुद्रित करता है।
  • __fish_complete_pids कमांड नाम के साथ विवरण के रूप में सभी प्रक्रियाओं आईडी की एक सूची मुद्रित करता है।
  • __fish_complete_suffix SUFFIX फ़ाइल पूर्ण होने के साथ-साथ वैकल्पिक विवरण के साथ SUFFIX में समाप्त होने वाली फ़ाइलों को अनुमति देता है।
  • __fish_complete_users विवरण के रूप में उनके पूर्ण नाम वाले सभी उपयोगकर्ताओं की एक सूची मुद्रित करता है।
  • __fish_print_filesystems सभी ज्ञात फ़ाइल सिस्टम की एक सूची मुद्रित करता है। वर्तमान में, यह एक स्थिर सूची है, और मेजबान ऑपरेटिंग सिस्टम वास्तव में समझने वाली फाइल सिस्टम पर निर्भर नहीं है।
  • __fish_print_hostnames सभी ज्ञात होस्टनामों की एक सूची मुद्रित करता है। यह फ़ंक्शंस nfs सर्वर के लिए fstab खोजता है, ज्ञात होस्ट के लिए ssh और /etc/hosts फ़ाइल को चेक /etc/hosts है।
  • __fish_print_interfaces सभी ज्ञात नेटवर्क इंटरफेस की एक सूची मुद्रित करता है।
  • __fish_print_packages सभी स्थापित संकुलों की एक सूची मुद्रित करता है। यह फ़ंक्शन वर्तमान में डेबियन, आरपीएम और जेनेटू पैकेज को संभालता है।

पूरा करने के लिए कहां रखा जाए

पूर्णता को कमांडलाइन या कॉन्फ़िगरेशन फ़ाइल में परिभाषित किया जा सकता है, लेकिन उन्हें स्वचालित रूप से लोड भी किया जा सकता है। मछली स्वचालित रूप से सरणी चर $fish_complete_path में किसी भी निर्देशिका के माध्यम से $fish_complete_path , और परिभाषित होने पर परिभाषित किसी भी पूर्णता को स्वचालित रूप से लोड किया जाता है। एक पूर्णता फ़ाइल में फ़ाइल नाम होना चाहिए जिसमें पूरा करने के लिए कमांड का नाम और प्रत्यय ' .fish ' होना चाहिए।

डिफ़ॉल्ट रूप से, मछली पहली उपलब्ध फ़ाइल का उपयोग करके पूर्णता के लिए निम्न की खोज करती है:

  • अंतिम उपयोगकर्ताओं के लिए अपनी निर्देशिका को पूरा करने के लिए एक निर्देशिका, आमतौर पर ~/.config/fish/completions ( XDG_CONFIG_HOME पर्यावरण चर द्वारा नियंत्रित);
  • सिस्टम प्रशासकों के लिए सिस्टम पर सभी उपयोगकर्ताओं के लिए पूर्णता स्थापित करने के लिए एक निर्देशिका, आमतौर पर /etc/fish/completions ;
  • तृतीय-पक्ष सॉफ़्टवेयर विक्रेताओं के लिए एक निर्देशिका उनके सॉफ़्टवेयर के लिए अपना पूरा पूरा करने के लिए, आमतौर पर /usr/share/fish/vendor_completions.d ;
  • मछलियों के साथ भेजे गए समापन, आमतौर पर /usr/share/fish/completions में स्थापित होते हैं; तथा
  • ऑपरेटिंग सिस्टम के मैन्युअल से स्वचालित रूप से जेनरेट किए गए प्राप्तियां, आमतौर पर ~/.local/share/fish/generated_completions में संग्रहीत ~/.local/share/fish/generated_completions

इन पथों को बिल्ड, स्थापित, या रन टाइम पर सेट पैरामीटर द्वारा नियंत्रित किया जाता है, और ऊपर सूचीबद्ध डिफ़ॉल्ट से भिन्न हो सकते हैं।

यह व्यापक खोज भ्रमित हो सकती है। यदि आप अनिश्चित हैं, तो आपकी समाप्ति शायद ~/.config/fish/completions

यदि आपने एक सामान्य यूनिक्स कमांड के लिए नए पूर्णताएं लिखी हैं, तो कृपया आगे की सहायता और विकास में निर्देशों के माध्यम से इसे सबमिट करके अपना काम साझा करने पर विचार करें।

यदि आप एक और प्रोग्राम विकसित कर रहे हैं और अपने कार्यक्रम के साथ पूरा करना चाहते हैं, तो उन्हें "विक्रेता" पूर्णता निर्देशिका में इंस्टॉल करें। चूंकि यह पथ सिस्टम से सिस्टम में भिन्न हो सकता है, इसलिए pkgconfig ढांचे का उपयोग pkg-config --variable completionsdir fish के आउटपुट के साथ इस पथ को खोजने के लिए किया जाना चाहिए।

पैरामीटर विस्तार (ग्लोबिंग)

जब कमांडलाइन पर किसी प्रोग्राम के लिए तर्क दिया जाता है, तो यह कमांड पर भेजे जाने से पहले पैरामीटर विस्तार की प्रक्रिया से गुजरता है। पैरामीटर विस्तार एक शक्तिशाली तंत्र है जो आपको विभिन्न तरीकों से पैरामीटर का विस्तार करने की अनुमति देता है, जिसमें फाइलों पर वाइल्डकार्ड मिलान करना, पैरामीटर में शैल वैरिएबल का मान डालना या पैरामीटर सूची के रूप में किसी अन्य कमांड के आउटपुट का उपयोग करना शामिल है।

वाइल्डकार्ड

यदि पैरामीटर में कोई सितारा ( * ) या कोई प्रश्न चिह्न ( ? ) मौजूद है, तो fish किसी दिए गए पैरामीटर से किसी भी फाइल को मिलान करने का प्रयास करती है:

  • ? '/' को छोड़कर किसी एकल चरित्र से मेल खा सकता है।
  • * वर्णों की किसी भी स्ट्रिंग से मेल खा सकता है जिसमें '/' नहीं है। इसमें एक खाली स्ट्रिंग से मेल खाना शामिल है।
  • ** पात्रों की किसी भी स्ट्रिंग से मेल खाता है। इसमें एक खाली स्ट्रिंग से मेल खाना शामिल है। मिलान की गई स्ट्रिंग में / चरित्र शामिल हो सकता है; यानी, यह उपनिर्देशिका में recurses। ध्यान दें कि अन्य तारों के साथ इस वाइल्डकार्ड को बढ़ाने से आप मौजूदा कार्यशील निर्देशिका ( $PWD ) में फ़ाइलों से मेल नहीं खाएंगे यदि आप स्लैश ("/") के साथ स्ट्रिंग को अलग करते हैं। यह zsh जैसे अन्य शैल के विपरीत है। उदाहरण के लिए, zsh में **\/*.fish पीडब्लूडी में फिश फाइलों से मेल खाती है लेकिन मछली में केवल उपनिर्देशिका में ऐसी फाइलों से मेल खाती है। मछली में आपको पीडब्ल्यूडी के साथ-साथ उपनिर्देशिका में फ़ाइलों से मेल खाने के लिए ***.fish टाइप करनी चाहिए।

अन्य शैल, जैसे कि zsh, ग्लोब द्वारा मेल की गई फ़ाइलों को प्रतिबंधित करने के लिए एक समृद्ध ग्लोब वाक्यविन्यास प्रदान करते हैं। उदाहरण के लिए, **(.) , केवल नियमित फ़ाइलों से मेल खाते हैं। मछली पहियों को पुनर्निर्मित करने के बजाए, ऐसी सुविधाओं को ऐसे कार्यक्रमों में स्थगित करना पसंद करती है, जैसे find । इस प्रकार, यदि आप केवल नियमित फाइलों के लिए वाइल्डकार्ड विस्तार को सीमित करना चाहते हैं तो मछली दृष्टिकोण को परिभाषित करना और एक फ़ंक्शन का उपयोग करना है। उदाहरण के लिए,

function ff --description 'Like ** but only returns plain files.'
    # This also ignores .git directories.
    find . \( -name .git -type d -prune \) -o -type f | \ 
        sed -n -e '/^\.\/\.git$/n' -e 's/^\.\///p'
end

इसके बाद आप इसे ** my_prog (ff) स्थान पर, my_prog (ff) $ PWD में या नीचे नियमित फ़ाइलों को पास करने के लिए उपयोग my_prog

वाइल्डकार्ड मैचों को असंवेदनशील रूप से क्रमबद्ध किया जाता है। संख्याओं वाले मैचों को सॉर्ट करते समय, लगातार अंकों को एक तत्व माना जाता है, ताकि स्ट्रिंग '1' '5' और '12' को दिए गए क्रम में क्रमबद्ध किया जा सके।

डॉट से शुरू होने वाले फ़ाइल नामों पर विचार नहीं किया जाता है जब वाइल्डकार्डिंग जब तक कि डॉट को विशेष रूप से फ़ाइल नाम के पहले अक्षर के रूप में नहीं दिया जाता है।

उदाहरण:

  • a* वर्तमान निर्देशिका में 'ए' से शुरू होने वाली किसी भी फाइल से मेल खाता है।
  • ??? वर्तमान निर्देशिका में किसी भी फ़ाइल से मेल खाता है जिसका नाम बिल्कुल तीन वर्ण लंबा है।
  • ** वर्तमान निर्देशिका और इसकी सभी उपनिर्देशिकाओं में किसी भी फाइल और निर्देशिका से मेल खाता है।

ध्यान दें कि अधिकांश आदेशों के लिए, यदि कोई वाइल्डकार्ड विस्तार करने में विफल रहता है, तो आदेश निष्पादित नहीं होता है, $status nonzero पर सेट होती है, और एक चेतावनी मुद्रित होती है। यह व्यवहार बैश में shopt -s failglob सेटिंग के साथ संगत है। बिल्कुल 3 अपवाद हैं, अर्थात् set , count और इसके for । उनके ग्लोब को शून्य तर्कों में विस्तार करने की अनुमति है, जैसे shopt -s nullglob में shopt -s nullglob में।

उदाहरण:

ls *.foo
# Lists the .foo files, or warns if there aren't any.

set foos *.foo
if count $foos >/dev/null
    ls $foos
end
# Lists the .foo files, if any.

कमांड प्रतिस्थापन

आदेशों की एक श्रृंखला का आउटपुट पैरामीटर के रूप में किसी अन्य कमांड के रूप में उपयोग किया जा सकता है। यदि पैरामीटर में कंस्ट्रैसिस का एक सेट होता है, तो कोष्ठक द्वारा संलग्न पाठ को कमांड की सूची के रूप में व्याख्या किया जाएगा। विस्तार पर, इस सूची को निष्पादित किया जाता है, और आउटपुट द्वारा प्रतिस्थापित किया जाता है। यदि आउटपुट एक से अधिक लाइन लंबा है, तो प्रत्येक पंक्ति को नए पैरामीटर में विस्तारित किया जाएगा। IFS को खाली स्ट्रिंग पर सेट करने से लाइन विभाजन को अक्षम कर दिया जाएगा।

अंतिम रन कमांड प्रतिस्थापन की निकास स्थिति स्टेटस चर में उपलब्ध है।

आउटपुट का केवल एक हिस्सा इस्तेमाल किया जा सकता है, विवरण के लिए सूचकांक सीमा विस्तार देखें।

उदाहरण:

echo (basename image.jpg .jpg).png
# Outputs 'image.png'.

for i in *.jpg; convert $i (basename $i .jpg).png; end
# Convert all JPEG files in the current directory to the
# PNG format using the 'convert' program.

begin; set -l IFS; set data (cat data.txt); end
# Set the `data` variable to the contents of 'data.txt'
# without splitting it into an array.

ब्रेस विस्तार

घुंघराले ब्रेसिज़ में संलग्न वर्णों की अल्पविराम से अलग सूची का विस्तार किया जाएगा ताकि सूची का प्रत्येक तत्व एक नया पैरामीटर बन जाए।

उदाहरण:

echo input.{c,h,txt}
# Outputs 'input.c input.h input.txt'

mv *.{c,h} src/
# Moves all files with the suffix '.c' or '.h' to the subdirectory src.

परिवर्तनीय विस्तार

अक्षरों की एक स्ट्रिंग के बाद एक डॉलर का चिह्न उसी नाम के साथ खोल चर के मान में विस्तारित किया जाता है। शैल चर के अवधारणा के परिचय के लिए, शैल चर अनुभाग पढ़ें।

अपरिभाषित और खाली चर कुछ भी नहीं बढ़ते हैं।

पाठ से परिवर्तनीय नाम को अलग करने के लिए वैरिएबल को डबल-कोट्स या ब्रेसेस के भीतर एन्सेज़ करें।

उदाहरण:

echo $HOME
# Prints the home directory of the current user.

echo $nonexistentvariable
# Prints no output.

echo The plural of $WORD is "$WORD"s
# Prints "The plural of cat is cats" when $WORD is set to cat.
echo The plural of $WORD is {$WORD}s
# ditto

ध्यान दें कि उद्धरण या ब्रेसिज़ के बिना, मछली $WORDs नामक चर का विस्तार करने का प्रयास $WORDs , जो अस्तित्व में नहीं हो सकती है।

उत्तरार्द्ध वाक्यविन्यास {$WORD} ब्रेस विस्तार का शोषण करके काम करता है; देखभाल को शून्य-तत्व सरणी चर और अपरिभाषित चर के साथ लिया जाना चाहिए, क्योंकि ये कार्टेसियन उत्पाद के रूप में विस्तारित होते हैं, इसलिए वे स्ट्रिंग को खत्म करते हैं।

परिवर्तनीय विस्तार डबल उद्धृत तारों पर किए गए विस्तार का एकमात्र प्रकार है। There is, however, an important difference in how variables are expanded when quoted and when unquoted. An unquoted variable expansion will result in a variable number of arguments. For example, if the variable $foo has zero elements or is undefined, the argument $foo will expand to zero elements. If the variable $foo is an array of five elements, the argument $foo will expand to five elements. When quoted, like "$foo" , a variable expansion will always result in exactly one argument. Undefined variables will expand to the empty string, and array variables will be concatenated using the space character.

There is one further notable feature of fish variable expansion. Consider the following code snippet:

set foo a b c
set a 10; set b 20; set c 30
for i in (seq (count $$foo))
    echo $$foo[$i]
end

# Output is:
# 10
# 20
# 30

The above code demonstrates how to use multiple ' $ ' symbols to expand the value of a variable as a variable name. One can think of the $ symbol as a variable dereference operator. When using this feature together with array brackets, the brackets will always match the innermost $ dereference. Thus, $$foo[5] will always mean the fifth element of the foo variable should be dereferenced, not the fifth element of the doubly dereferenced variable foo . The latter can instead be expressed as $$foo[1][5] .

Cartesian Products

Lists adjacent to other lists or strings are expanded as cartesian products:

उदाहरण:

> echo {good,bad}" apples"
good apples bad apples

> set -l a x y z
> set -l b 1 2 3

> echo $a$b
x1 y1 z1 x2 y2 z2 x3 y3 z3

> echo $a"-"$b
x-1 y-1 z-1 x-2 y-2 z-2 x-3 y-3 z-3

> echo {x,y,z}$b
x1 y1 z1 x2 y2 z2 x3 y3 z3

> echo {$b}word
1word 2word 3word

Be careful when you try to use braces to separate variable names from text. The dangers noted in the last example above can be avoided by wrapping the variable in double quotes instead of braces ( echo "$b"word ).

Index range expansion

Both command substitution and shell variable expansion support accessing only specific items by providing a set of indices in square brackets. It's often needed to access a sequence of elements. To do this, use the range operator ' .. ' for this. A range ' a..b ', where range limits 'a' and 'b' are integer numbers, is expanded into a sequence of indices ' a a+1 a+2 ... b ' or ' a a-1 a-2 ... b ' depending on which of 'a' or 'b' is higher. The negative range limits are calculated from the end of the array or command substitution. Note that invalid indexes for either end are silently clamped to one or the size of the array as appropriate.

Some examples:

# Limit the command substitution output
echo (seq 10)[2..5]
# Uses elements from 2 to 5
# Output is: 2 3 4 5

# Use overlapping ranges:
echo (seq 10)[2..5 1..3]
# Takes elements from 2 to 5 and then elements from 1 to 3
# Output is: 2 3 4 5 1 2 3

# Reverse output
echo (seq 10)[-1..1]
# Uses elements from the last output line to
# the first one in reverse direction
# Output is: 10 9 8 7 6 5 4 3 2 1

The same works when setting or expanding variables:

# Reverse path variable
set PATH $PATH[-1..1]
# or
set PATH[-1..1] $PATH

# Use only n last items of the PATH
set n -3
echo $PATH[$n..-1]

Note that variables can be used as indices for expansion of variables, but not command substitution.

Home directory expansion

The ~ (tilde) character at the beginning of a parameter, followed by a username, is expanded into the home directory of the specified user. A lone ~ , or a ~ followed by a slash, is expanded into the home directory of the process owner.

Process expansion

The % (percent) character at the beginning of a parameter followed by a string is expanded into a process ID (PID). The following expansions are performed:

  • If the string is the entire word self , the shell's PID is the result.
  • Otherwise, if the string is the entire word last , the last job's PID is the result.
  • Otherwise, if the string is the ID of a job, the result is the process group ID of the job.
  • Otherwise, if any child processes match the specified string, their PIDs are the result of the expansion.
  • Otherwise, if any processes owned by the user match the specified string, their PIDs are the result of the expansion.
  • If none of these matches apply, an error is produced.

This form of expansion is useful for commands like kill and fg, which take process IDs as arguments.

उदाहरण:

fg %ema will search for a process whose command line begins with the letters 'ema', such as emacs, and if found, put it in the foreground.

kill -s SIGINT %3 will send the SIGINT signal to the job with job ID 3.

Combining different expansions

All of the above expansions can be combined. If several expansions result in more than one parameter, all possible combinations are created.

When combining multiple parameter expansions, expansions are performed in the following order:

  • Command substitutions
  • Variable expansions
  • Bracket expansion
  • Pid expansion
  • Wildcard expansion

Expansions are performed from right to left, nested bracket expansions are performed from the inside and out.

उदाहरण:

If the current directory contains the files 'foo' and 'bar', the command echo a(ls){1,2,3} will output 'abar1 abar2 abar3 afoo1 afoo2 afoo3'.

Shell variable and function names

The names given to shell objects such as variables and function names are known as "identifiers". Each type of identifier has rules that define the valid sequence of characters which compose the identifier.

A variable name cannot be empty. It can contain only letters, digits, and underscores. It may begin and end with any of those characters.

A function name cannot be empty. It may not begin with a hyphen ("-") and may not contain a slash ("/"). All other characters, including a space, are valid.

A bind mode name (eg, bind -m abc ... ) is restricted to the rules for valid variable names.

Shell variables

Shell variables are named pieces of data, which can be created, deleted and their values changed and used by the user. Variables may optionally be "exported", so that a copy of the variable is available to any subprocesses the shell creates. An exported variable is referred to as an "environment variable".

To set a variable value, use the set . A variable name can not be empty and can contain only letters, digits, and underscores. It may begin and end with any of those characters.

उदाहरण:

To set the variable smurf_color to the value blue , use the command set smurf_color blue .

After a variable has been set, you can use the value of a variable in the shell through variable expansion .

उदाहरण:

To use the value of the variable smurf_color , write $ (dollar symbol) followed by the name of the variable, like echo Smurfs are usually $smurf_color , which would print the result 'Smurfs are usually blue'.

Variable scope

There are three kinds of variables in fish: universal, global and local variables. Universal variables are shared between all fish sessions a user is running on one computer. Global variables are specific to the current fish session, but are not associated with any specific block scope, and will never be erased unless the user explicitly requests it using set -e . Local variables are specific to the current fish session, and associated with a specific block of commands, and is automatically erased when a specific block goes out of scope. A block of commands is a series of commands that begins with one of the commands for , while , if , function , begin or switch , and ends with the command end . The user can specify that a variable should have either global or local scope using the -g/--global or -l/--local switches.

Variables can be explicitly set to be universal with the -U or --universal switch, global with the -g or --global switch, or local with the -l or --local switch. The scoping rules when creating or updating a variable are:

  1. If a variable is explicitly set to either universal, global or local, that setting will be honored. If a variable of the same name exists in a different scope, that variable will not be changed.
  2. If a variable is not explicitly set to be either universal, global or local, but has been previously defined, the variable scope is not changed.
  3. If a variable is not explicitly set to be either universal, global or local and has never before been defined, the variable will be local to the currently executing function. Note that this is different from using the -l or --local flag. If one of those flags is used, the variable will be local to the most inner currently executing block, while without these the variable will be local to the function. If no function is executing, the variable will be global.

There may be many variables with the same name, but different scopes. When using a variable, the variable scope will be searched from the inside out, ie a local variable will be used rather than a global variable with the same name, a global variable will be used rather than a universal variable with the same name.

उदाहरण:

The following code will not output anything:

begin
    # This is a nice local scope where all variables will die
    set -l pirate 'There be treasure in them thar hills'
end

echo $pirate
# This will not output anything, since the pirate was local

More on universal variables

Universal variables are variables that are shared between all the users' fish sessions on the computer. Fish stores many of its configuration options as universal variables. This means that in order to change fish settings, all you have to do is change the variable value once, and it will be automatically updated for all sessions, and preserved across computer reboots and login/logout.

To see universal variables in action, start two fish sessions side by side, and issue the following command in one of them set fish_color_cwd blue . Since fish_color_cwd is a universal variable, the color of the current working directory listing in the prompt will instantly change to blue on both terminals.

Universal variables are stored in the file .config/fish/fishd.MACHINE_ID , where MACHINE_ID is typically your MAC address. Do not edit this file directly, as your edits may be overwritten. Edit them through fish scripts or by using fish interactively instead.

Do not append to universal variables in config.fish , because these variables will then get longer with each new shell instance. Instead, simply set them once at the command line.

Variable scope for functions

When calling a function, all current local variables temporarily disappear. This shadowing of the local scope is needed since the variable namespace would become cluttered, making it very easy to accidentally overwrite variables from another function.

उदाहरण के लिए:

function shiver
    set phrase 'Shiver me timbers'
end

function avast
    set phrase 'Avast, mateys'
    # Calling the shiver function here can not
    # change any variables in the local scope
    shiver
    echo $phrase
end
avast

# Outputs "Avast, mateys"

Exporting variables

Variables in fish can be exported. This means the variable will be inherited by any commands started by fish. It is convention that exported variables are in uppercase and unexported variables are in lowercase.

Variables can be explicitly set to be exported with the -x or --export switch, or not exported with the -u or --unexport switch. The exporting rules when creating or updating a variable are identical to the scoping rules for variables:

  1. If a variable is explicitly set to either be exported or not exported, that setting will be honored.
  2. If a variable is not explicitly set to be exported or not exported, but has been previously defined, the previous exporting rule for the variable is kept.
  3. If a variable is not explicitly set to be either exported or not exported and has never before been defined, the variable will not be exported.

Arrays

fish can store a list of multiple strings inside of a variable. To access one element of an array, use the index of the element inside of square brackets, like this:

echo $PATH[3]

Note that array indices start at 1 in fish , not 0, as is more common in other languages. This is because many common Unix tools like seq are more suited to such use. An invalid index is silently ignored resulting in no value being substituted (not an empty string).

If you do not use any brackets, all the elements of the array will be written as separate items. This means you can easily iterate over an array using this syntax:

for i in $PATH; echo $i is in the path; end

To create a variable smurf , containing the items blue and small , simply write:

set smurf blue small

It is also possible to set or erase individual elements of an array:

# Set smurf to be an array with the elements 'blue' and 'small'
set smurf blue small

# Change the second element of smurf to 'evil'
set smurf[2] evil

# Erase the first element
set -e smurf[1]

# Output 'evil'
echo $smurf

If you specify a negative index when expanding or assigning to an array variable, the index will be calculated from the end of the array. For example, the index -1 means the last index of an array.

A range of indices can be specified, see index range expansion for details.

All arrays are one-dimensional and cannot contain other arrays, although it is possible to fake nested arrays using the dereferencing rules of variable expansion .

fish automatically creates arrays from the variables PATH , CDPATH and MANPATH when it is started. (Previous versions created arrays from all colon-delimited environment variables.)

Special variables

The user can change the settings of fish by changing the values of certain variables.

  • A large number of variable starting with the prefixes fish_color and fish_pager_color. See Variables for changing highlighting colors for more information.
  • fish_escape_delay_ms overrides the default timeout of 300ms (default key bindings) or 10ms (vi key bindings) after seeing an escape character before giving up on matching a key binding. See the documentation for the bind builtin command. This delay facilitates using escape as a meta key.
  • fish_greeting , the greeting message printed on startup.
  • fish_history , the current history session name. If set, all subsequent commands within an interactive fish session will be logged to a separate file identified by the value of the variable. If unset, or set to default , the default session name "fish" is used. If set to an empty string, history is not saved to disk (but is still available within the interactive session).
  • fish_user_paths , an array of directories that are prepended to PATH . This can be a universal variable.
  • umask , the current file creation mask. The preferred way to change the umask variable is through the umask function . An attempt to set umask to an invalid value will always fail.
  • BROWSER , the user's preferred web browser. If this variable is set, fish will use the specified browser instead of the system default browser to display the fish documentation.
  • CDPATH , an array of directories in which to search for the new directory for the cd builtin.
  • LANG , LC_ALL , LC_COLLATE , LC_CTYPE , LC_MESSAGES , LC_MONETARY , LC_NUMERIC and LC_TIME set the language option for the shell and subprograms. See the section Locale variables for more information.
  • PATH , an array of directories in which to search for commands

fish also sends additional information to the user through the values of certain environment variables. The user cannot change the values of most of these variables.

  • _ , the name of the currently running command.
  • argv , an array of arguments to the shell or function. argv is only defined when inside a function call, or if fish was invoked with a list of arguments, like fish myscript.fish foo bar . This variable can be changed by the user.
  • history , an array containing the last commands that were entered.
  • HOME , the user's home directory. This variable can be changed by the user.
  • IFS , the internal field separator that is used for word splitting with the read builtin . Setting this to the empty string will also disable line splitting in command substitution . This variable can be changed by the user.
  • PWD , the current working directory.
  • status , the exit status of the last foreground job to exit. If the job was terminated through a signal, the exit status will be 128 plus the signal number.
  • USER , the current username. This variable can be changed by the user.
  • CMD_DURATION , the runtime of the last command in milliseconds.
  • FISH_VERSION , the version of the currently running fish
  • SHLVL , the level of nesting of shells
  • COLUMNS and LINES , the current size of the terminal in height and width. These values are only used by fish if the operating system does not report the size of the terminal. Both variables must be set in that case otherwise a default of 80x24 will be used. They are updated when the window size changes.

The names of these variables are mostly derived from the csh family of shells and differ from the ones used by Bourne style shells such as bash.

Variables whose name are in uppercase are exported to the commands started by fish, while those in lowercase are not exported. This rule is not enforced by fish, but it is good coding practice to use casing to distinguish between exported and unexported variables. fish also uses several variables internally. Such variables are prefixed with the string __FISH or __fish. These should never be used by the user. Changing their value may break fish.

The status variable

Whenever a process exits, an exit status is returned to the program that started it (usually the shell). This exit status is an integer number, which tells the calling application how the execution of the command went. In general, a zero exit status means that the command executed without problem, but a non-zero exit status means there was some form of problem.

Fish stores the exit status of the last process in the last job to exit in the status variable.

If fish encounters a problem while executing a command, the status variable may also be set to a specific value:

  • 0 is generally the exit status of fish commands if they successfully performed the requested operation.
  • 1 is generally the exit status of fish commands if they failed to perform the requested operation.
  • 121 is generally the exit status of fish commands if they were supplied with invalid arguments.
  • 123 means that the command was not executed because the command name contained invalid characters.
  • 124 means that the command was not executed because none of the wildcards in the command produced any matches.
  • 125 means that while an executable with the specified name was located, the operating system could not actually execute the command.
  • 126 means that while a file with the specified name was located, it was not executable.
  • 127 means that no function, builtin or command with the given name could be located.

If a process exits through a signal, the exit status will be 128 plus the number of the signal.

Variables for changing highlighting colors

The colors used by fish for syntax highlighting can be configured by changing the values of a various variables. The value of these variables can be one of the colors accepted by the set_color command. The --bold or -b switches accepted by set_color are also accepted.

The following variables are available to change the highlighting colors in fish:

  • fish_color_normal , the default color
  • fish_color_command , the color for commands
  • fish_color_quote , the color for quoted blocks of text
  • fish_color_redirection , the color for IO redirections
  • fish_color_end , the color for process separators like ';' and '&'
  • fish_color_error , the color used to highlight potential errors
  • fish_color_param , the color for regular command parameters
  • fish_color_comment , the color used for code comments
  • fish_color_match , the color used to highlight matching parenthesis
  • fish_color_search_match , the color used to highlight history search matches
  • fish_color_operator , the color for parameter expansion operators like '*' and '~'
  • fish_color_escape , the color used to highlight character escapes like '\n' and '\x70'
  • fish_color_cwd , the color used for the current working directory in the default prompt
  • fish_color_autosuggestion , the color used for autosuggestions
  • fish_color_user , the color used to print the current username in some of fish default prompts
  • fish_color_host , the color used to print the current host system in some of fish default prompts
  • fish_color_cancel , the color for the '^C' indicator on a canceled command

Additionally, the following variables are available to change the highlighting in the completion pager:

  • fish_pager_color_prefix , the color of the prefix string, ie the string that is to be completed
  • fish_pager_color_completion , the color of the completion itself
  • fish_pager_color_description , the color of the completion description
  • fish_pager_color_progress , the color of the progress bar at the bottom left corner
  • fish_pager_color_secondary , the background color of the every second completion

उदाहरण:

To make errors highlighted and red, use:

set fish_color_error red --bold

Locale variables

The most common way to set the locale to use a command like 'set -x LANG en_GB.utf8', which sets the current locale to be the English language, as used in Great Britain, using the UTF-8 character set. For a list of available locales, use 'locale -a'.

LANG , LC_ALL , LC_COLLATE , LC_CTYPE , LC_MESSAGES , LC_MONETARY , LC_NUMERIC and LC_TIME set the language option for the shell and subprograms. These variables work as follows: LC_ALL forces all the aspects of the locale to the specified value. If LC_ALL is set, all other locale variables will be ignored. The other LC_ variables set the specified aspect of the locale information. LANG is a fallback value, it will be used if none of the LC_ variables are specified.

Builtin commands

Many other shells have a large library of builtin commands. Most of these commands are also available as standalone commands, but have been implemented in the shell anyway. To avoid code duplication, and to avoid the confusion of subtly differing versions of the same command, fish generally only implements builtins for actions which cannot be performed by a regular command.

For a list of all builtins, functions and commands shipped with fish, see the table of contents . The documentation is also available by using the --help switch of the command.

Command line editor

The fish editor features copy and paste, a searchable history and many editor functions that can be bound to special keyboard shortcuts.

Similar to bash, fish has Emacs and Vi editing modes. The default editing mode is Emacs. You can switch to Vi mode with fish_vi_key_bindings and switch back with fish_default_key_bindings . You can also make your own key bindings by creating a function and setting $fish_key_bindings to its name. उदाहरण के लिए:

function hybrid_bindings --description "Vi-style bindings that inherit emacs-style bindings in all modes"
    for mode in default insert visual
        fish_default_key_bindings -M $mode
    end
    fish_vi_key_bindings --no-erase
end
set -g fish_key_bindings hybrid_bindings

Shared bindings

Some bindings are shared between emacs- and vi-mode because they aren't text editing bindings or because what Vi/Vim does for a particular key doesn't make sense for a shell.

  • Tab completes the current token. Shift - Tab completes the current token and starts the pager's search mode.
  • Alt - and Alt - move the cursor one word left or right, or moves forward/backward in the directory history if the command line is empty. If the cursor is already at the end of the line, and an autosuggestion is available, Alt - (or Alt - F ) accepts the first word in the suggestion.
  • and (or Control - P and Control - N for emacs aficionados) search the command history for the previous/next command containing the string that was specified on the commandline before the search was started. If the commandline was empty when the search started, all commands match. See the history section for more information on history searching.
  • Alt - and Alt - search the command history for the previous/next token containing the token under the cursor before the search was started. If the commandline was not on a token when the search started, all tokens match. See the history section for more information on history searching.
  • Control - C cancels the entire line.
  • Control - D delete one character to the right of the cursor. If the command line is empty, Control - D will exit fish.
  • Control - U moves contents from the beginning of line to the cursor to the killring .
  • Control - L clears and repaints the screen.
  • Control - W moves the previous path component (everything up to the previous "/") to the killring .
  • Control - X copies the current buffer to the system's clipboard, Control - V inserts the clipboard contents.
  • Alt - d moves the next word to the killring .
  • Alt - h (or F1 ) shows the manual page for the current command, if one exists.
  • Alt - l lists the contents of the current directory, unless the cursor is over a directory argument, in which case the contents of that directory will be listed.
  • Alt - p adds the string ' | less; ' to the end of the job under the cursor. The result is that the output of the command will be paged.
  • Alt - w prints a short description of the command under the cursor.
  • Alt - e edit the current command line in an external editor. The editor is chosen from the first available of the $VISUAL or $EDITOR variables.
  • Alt - v Same as Alt - e .

Emacs mode commands

  • Home or Control - A moves the cursor to the beginning of the line.
  • End or Control - E moves to the end of line. If the cursor is already at the end of the line, and an autosuggestion is available, End or Control - E accepts the autosuggestion.
  • (or Control - B ) and (or Control - F ) move the cursor left or right by one character. If the cursor is already at the end of the line, and an autosuggestion is available, the key and the Control - F combination accept the suggestion.
  • Delete and Backspace removes one character forwards or backwards respectively.
  • Control - K moves contents from the cursor to the end of line to the killring .
  • Alt - c capitalizes the current word.
  • Alt - u makes the current word uppercase.
  • Control - t transposes the last two characters
  • Alt - t transposes the last two words

You can change these key bindings using the bind builtin command.

Vi mode commands

Vi mode allows for the use of Vi-like commands at the prompt. Initially, insert mode is active. Escape enters command mode . The commands available in command, insert and visual mode are described below. Vi mode shares some bindings with Emacs mode .

It is also possible to add all emacs-mode bindings to vi-mode by using something like

function fish_user_key_bindings
    # Execute this once per mode that emacs bindings should be used in
    fish_default_key_bindings -M insert
    # Without an argument, fish_vi_key_bindings will default to
    # resetting all bindings.
    # The argument specifies the initial mode (insert, "default" or visual).
    fish_vi_key_bindings insert
end

When in vi-mode, the fish_mode_prompt function will display a mode indicator to the left of the prompt. The fish_vi_cursor function will be used to change the cursor's shape depending on the mode in supported terminals. To disable this feature, override it with an empty function. To display the mode elsewhere (like in your right prompt), use the output of the fish_default_mode_prompt function.

Command mode

Command mode is also known as normal mode.

  • h moves the cursor left.
  • l moves the cursor right.
  • i enters insert mode at the current cursor position.
  • v enters visual mode at the current cursor position.
  • a enters insert mode after the current cursor position.
  • Shift - A enters insert mode at the end of the line.
  • 0 (zero) moves the cursor to beginning of line (remaining in command mode).
  • d d deletes the current line and moves it to the killring .
  • Shift - D deletes text after the current cursor position and moves it to the killring .
  • p pastes text from the killring .
  • u search history backwards.
  • [ and ] search the command history for the previous/next token containing the token under the cursor before the search was started. See the history section for more information on history searching.
  • Backspace moves the cursor left.

Insert mode

  • Escape enters command mode .
  • Backspace removes one character to the left.

Visual mode

  • and extend the selection backward/forward by one character.
  • b and w extend the selection backward/forward by one word.
  • d and x move the selection to the killring and enter command mode .
  • Escape and Control - C enter command mode .

Copy and paste (Kill Ring)

fish uses an Emacs style kill ring for copy and paste functionality. Use Control - K to cut from the current cursor position to the end of the line. The string that is cut (aka killed) is inserted into a linked list of kills, called the kill ring. To paste the latest value from the kill ring use Control - Y . After pasting, use Alt - Y to rotate to the previous kill.

Copy and paste from outside are also supported, both via the Control - X / Control - V bindings and via the terminal's paste function, for which fish enables "Bracketed Paste Mode". When pasting inside single quotes, pasted single quotes and backslashes are automatically escaped so that the result can be used as a single token simply by closing the quote after.

After a command has been entered, it is inserted at the end of a history list. Any duplicate history items are automatically removed. By pressing the up and down keys, the user can search forwards and backwards in the history. If the current command line is not empty when starting a history search, only the commands containing the string entered into the command line are shown.

By pressing Alt - and Alt - , a history search is also performed, but instead of searching for a complete commandline, each commandline is broken into separate elements just like it would be before execution, and the history is searched for an element matching that under the cursor.

History searches can be aborted by pressing the escape key.

Prefixing the commandline with a space will prevent the entire line from being stored in the history.

The command history is stored in the file ~/.local/share/fish/fish_history (or $XDG_DATA_HOME/fish/fish_history if that variable is set) by default. However, you can set the fish_history environment variable to change the name of the history session (resulting in a <session>_history file); both before starting the shell and while the shell is running.

उदाहरण:

To search for previous entries containing the word 'make', type make in the console and press the up key.

If the commandline reads cd m , place the cursor over the m character and press Alt - to search for previously typed words containing 'm'.

Multiline editing

The fish commandline editor can be used to work on commands that are several lines long. There are three ways to make a command span more than a single line:

  • Pressing the Enter key while a block of commands is unclosed, such as when one or more block commands such as for , begin or if do not have a corresponding end command.
  • Pressing Alt - Enter instead of pressing the Enter key.
  • By inserting a backslash ( \ ) character before pressing the Enter key, escaping the newline.

The fish commandline editor works exactly the same in single line mode and in multiline mode. To move between lines use the left and right arrow keys and other such keyboard shortcuts.

Running multiple programs

Normally when fish starts a program, this program will be put in the foreground, meaning it will take control of the terminal and fish will be stopped until the program finishes. Sometimes this is not desirable. For example, you may wish to start an application with a graphical user interface from the terminal, and then be able to continue using the shell. In such cases, there are several ways in which the user can change fish's behavior.

  1. By ending a command with the & (ampersand) symbol, the user tells fish to put the specified command into the background. A background process will be run simultaneous with fish . fish will retain control of the terminal, so the program will not be able to read from the keyboard.
  2. By pressing Control - Z , the user stops a currently running foreground program and returns control to fish . Some programs do not support this feature, or remap it to another key. GNU Emacs uses Control - X z to stop running.
  3. By using the fg and bg builtin commands, the user can send any currently running job into the foreground or background.

Note that functions cannot be started in the background. Functions that are stopped and then restarted in the background using the bg command will not execute correctly.

Initialization files

On startup, Fish evaluates a number of configuration files, which can be used to control the behavior of the shell. The location of these configuration variables is controlled by a number of environment variables, and their default or usual location is given below.

Configuration files are evaluated in the following order:

  • Configuration shipped with fish, which should not be edited, in $__fish_datadir/config.fish (usually /usr/share/fish/config.fish ).
  • System-wide configuration files, where administrators can include initialization that should be run for all users on the system - similar to /etc/profile for POSIX-style shells - in $__fish_sysconfdir (usually /etc/fish/config.fish );
  • Configuration snippets in files ending in .fish , in the directories:

    • $XDG_CONFIG_HOME/fish/conf.d (by default, ~/.config/fish/conf.d/ )
    • $__fish_sysconfdir/conf.d (by default, /etc/fish/conf.d )
    • /usr/share/fish/vendor_conf.d (set at compile time; by default, $__fish_datadir/conf.d )

    If there are multiple files with the same name in these directories, only the first will be executed. They are executed in order of their filename, sorted (like globs) in a natural order (ie "01" sorts before "2").

  • User initialization, usually in ~/.config/fish/config.fish (controlled by the XDG_CONFIG_HOME environment variable).

These paths are controlled by parameters set at build, install, or run time, and may vary from the defaults listed above.

This wide search may be confusing. If you are unsure where to put your own customisations, use ~/.config/fish/config.fish .

Note that ~/.config/fish/config.fish is sourced after the snippets. This is so users can copy snippets and override some of their behavior.

These files are all executed on the startup of every shell. If you want to run a command only on starting an interactive shell, use the exit status of the command status --is-interactive to determine if the shell is interactive. If you want to run a command only when using a login shell, use status --is-login instead. This will speed up the starting of non-interactive or non-login shells.

If you are developing another program, you may wish to install configuration which is run for all users of the fish shell on a system. This is discouraged; if not carefully written, they may have side-effects or slow the startup of the shell. Additionally, users of other shells will not benefit from the Fish-specific configuration. However, if they are absolutely required, you may install them to the "vendor" configuration directory. As this path may vary from system to system, the pkgconfig framework should be used to discover this path with the output of pkg-config --variable confdir fish .

उदाहरण:

If you want to add the directory ~/linux/bin to your PATH variable when using a login shell, add the following to your ~/.config/fish/config.fish file:

if status --is-login
    set -x PATH $PATH ~/linux/bin
end

If you want to run a set of commands when fish exits, use an event handler that is triggered by the exit of the shell:

function on_exit --on-process %self
    echo fish is now exiting
end

अन्य सुविधाओं

वाक्य - विन्यास पर प्रकाश डालना

fish interprets the command line as it is typed and uses syntax highlighting to provide feedback to the user. The most important feedback is the detection of potential errors. By default, errors are marked red.

Detected errors include:

  • Non existing commands.
  • Reading from or appending to a non existing file.
  • Incorrect use of output redirects
  • Mismatched parenthesis

When the cursor is over a parenthesis or a quote, fish also highlights its matching quote or parenthesis.

To customize the syntax highlighting, you can set the environment variables listed in the Variables for changing highlighting colors section.

Programmable title

When using most virtual terminals, it is possible to set the message displayed in the titlebar of the terminal window. This can be done automatically in fish by defining the fish_title function. The fish_title function is executed before and after a new command is executed or put into the foreground and the output is used as a titlebar message. The $_ environment variable will always contain the name of the job to be put into the foreground (Or 'fish' if control is returning to the shell) when the fish_prompt function is called. The first argument to fish_title will contain the most recently executed foreground command as a string, starting with fish 2.2.

Examples: The default fish title is

function fish_title
    echo $_ ' '
    pwd
end

To show the last command in the title:

function fish_title
    echo $argv[1]
end

Programmable prompt

When fish waits for input, it will display a prompt by evaluating the fish_prompt and fish_right_prompt functions. The output of the former is displayed on the left and the latter's output on the right side of the terminal. The output of fish_mode_prompt will be prepended on the left, though the default function only does this when in vi-mode .

Configurable greeting

If a function named fish_greeting exists, it will be run when entering interactive mode. Otherwise, if an environment variable named fish_greeting exists, it will be printed.

Event handlers

When defining a new function in fish, it is possible to make it into an event handler, ie a function that is automatically run when a specific event takes place. Events that can trigger a handler currently are:

  • When a signal is delivered
  • When a process or job exits
  • When the value of a variable is updated
  • When the prompt is about to be shown
  • When a command lookup fails

उदाहरण:

To specify a signal handler for the WINCH signal, write:

function --on-signal WINCH my_signal_handler
    echo Got WINCH signal!
end

Please note that event handlers only become active when a function is loaded, which means you might need to otherwise source or execute a function instead of relying on autoloading . One approach is to put it into your config.fish .

For more information on how to define new event handlers, see the documentation for the function command.

Debugging fish scripts

Fish includes a built in debugging facility. The debugger allows you to stop execution of a script at an arbitrary point. When this happens you are presented with an interactive prompt. At this prompt you can execute any fish command (there are no debug commands as such). For example, you can check or change the value of any variables using printf and set . As another example, you can run status print-stack-trace to see how this breakpoint was reached. To resume normal execution of the script, simply type exit or [ctrl-D].

To start a debug session simply run the builtin command breakpoint at the point in a function or script where you wish to gain control. Also, the default action of the TRAP signal is to call this builtin. So a running script can be debugged by sending it the TRAP signal with the kill command. Once in the debugger, it is easy to insert new breakpoints by using the funced function to edit the definition of a function.

Note: At the moment the debug prompt is identical to your normal fish prompt. This can make it hard to recognize that you've entered a debug session. Issue 1310 is open to improve this.

Common issues with fish

If you install fish in your home directory, fish will not work correctly for any other user than yourself. This is because fish needs its initialization files to function properly. To solve this problem, either copy the initialization files to each fish users home directory, or install them in /etc .

Further help and development

If you have a question not answered by this documentation, there are several avenues for help:

  1. The official mailing list at [email protected]
  2. The Internet Relay Chat channel, #fish on irc.oftc.net
  3. The project GitHub page

If you have an improvement for fish, you can submit it via the mailing list or the GitHub page.

原文