स्पष्ट रूप से निर्मित शेल को कैसे लागू किया जाए?


14

मैं cdअपनी आवश्यकताओं के अनुसार कमांड की कार्यक्षमता को अनुकूलित करना चाहता हूं।

मैंने निम्नलिखित कार्य को परिभाषित किया - function cd () { cd "$@" && pushd "$@"; }

इस फ़ंक्शन का आशय स्वचालित रूप से निर्देशिका को स्टैक पर धकेलना है ताकि यह मुझे pushd .हर बार मैन्युअल रूप से टाइप करने के प्रयास से बचाता है ।

हालांकि, उपरोक्त फ़ंक्शन एक असीम रूप से पुनरावर्ती फ़ंक्शन है, क्योंकि कॉल को फ़ंक्शन के रूप में cdव्याख्या की जाती है और cdअंतर्निहित नहीं है।

मैं cdइस फ़ंक्शन में अंतर्निहित का संदर्भ कैसे दूं?

मुझे पता है कि उपनाम का उपयोग करके बच सकते हैं \। फ़ंक्शंस से बचने या अधिक स्पष्ट तरीके से अंतर्निहित संदर्भ का तरीका क्या है?

नोट: मैं अपने कार्य का नाम किसी और चीज़ में नहीं रखना चाहता।


3
सिर्फ क्यों नहीं alias cd=pushd? जब आप किसी ऐसी चीज की अपेक्षा करते हैं जो निरपेक्ष पथ (जैसे, cd ../) नहीं है , तो आप क्या करेंगे ?
पैट्रिक

@ पैट्रिक pushdसमर्थन नहीं करता है -P। लेकिन आप सही हैं, जैसा कि प्रश्न में दिखाया गया है कि function cdयह थोड़ा गलत है, क्योंकि इसने दो बार निर्देशिका बदल दी।
टीनो

जवाबों:


6

commandअंतर्निहित बलों के लिए एक कमांड नाम अंतर्निहित या बाहरी कमांड (उर्फ और समारोह देखने लंघन) के रूप में व्याख्या की जा करने के लिए। यह बैश सहित सभी POSIX गोले में उपलब्ध है।

cd () { command cd "$@" && pushd "$@"; }

(ध्यान दें कि यह उदाहरण एक बुरा है: यह सापेक्ष पथों के साथ काम नहीं करता है, और आप pushdपहले स्थान पर बस टाइप कर सकते हैं ।)

बाश और zsh (लेकिन ksh नहीं) में, आप builtinउपनाम, फ़ंक्शंस और बाहरी कमांड को छोड़कर, एक कमांड नाम को एक बेसिन के रूप में मजबूर करने के लिए उपयोग कर सकते हैं ।


16

बैश में एक (बिल्टिन) कमांड है builtin, जो वास्तव में आपकी आवश्यकता है। जगह cdके साथ builtin cdअपने कार्य में प्रत्यावर्तन ठीक कर देंगे।


1

मुझे संदेह है कि जब आप कहते हैं कि "आप अपने फ़ंक्शन को किसी और चीज़ में नहीं बदलना चाहते हैं," तो आपका मतलब है कि आप मूल फ़ंक्शन के समान नाम से अपने फ़ंक्शन को कॉल करने में सक्षम होना चाहते हैं।

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

उदाहरण आवरण: शश:

#!/bin/bash
function my_wrapper() { wrapped_program $@ && dostuff }

और जैसे, .bash_aliases:

source /path/to/wrapper.sh
alias wrapped_program="my_wrapper"

लेकिन यह बहुत हैकरी है। commandजब संभव हो तो उपयोग करना बेहतर होता है।


-1

इसके लिए रिश्तेदार पथों के साथ काम करने के लिए, निम्नलिखित की आवश्यकता होगी:

function cd { 
   dir="$(realpath "$@")"
   command cd "$dir"
   pushd "$dir"
}

यह मानता है कि आप एक आधुनिक पर्याप्त लिनक्स डिस्ट्रो पर हैं जिसमें 'realpath' उपयोगिता है। (RHEL 6 उदाहरण के लिए नहीं है)। यदि पर्ल उपलब्ध है, तो 'realpath' का उपयोग करके नकली किया जा सकता है:

! realpath $(pwd) > /dev/null 2>&1  && function realpath {
    perl -e "use Cwd realpath; print realpath(\"$1\") . \"\\n\";"
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.