मैं अपने bashrc में एक स्थानीय फ़ंक्शन कैसे बना सकता हूं?


40

मेरे .bashrc में कुछ कोड थे जो दोहराए गए थे इसलिए मैंने इसे सरल बनाने के लिए एक फ़ंक्शन का उपयोग किया

do_stuff() {
  local version=$1
  export FOO_${version}_X="17"
  export FOO_${version}_Y="42"
}

do_stuff '5.1'
do_stuff '5.2'

हालाँकि, अब जब मैं अपने शेल का उपयोग "do_stuff" नाम के दायरे में करता हूं, तो मैं उस फ़ंक्शन को टैब-कम्प्लीट और रन कर सकता हूं (संभवतः मेरे पर्यावरण चर को गड़बड़ कर रहा है)। क्या "do_stuff" बनाने का एक तरीका केवल .bashrc के अंदर दिखाई देता है?


2
यदि आपने निर्यात को कम नहीं किया, तो आप एक उपधारा ()बनाने के लिए भी उपयोग कर सकते हैं । सरल मामलों के लिए एक और संभावना एक for version in 5.1 5.2लूप का उपयोग कर रही है , हालांकि इससे versionबचने की सुविधा मिलती है।
सिरो सेंटिल्ली 新疆 改造 iro i 事件 '

जवाबों:


40

unsetअपने अंतिम पंक्ति के रूप में उपयोग करें .bashrc:

unset -f do_stuff

फ़ंक्शन को हटा / अनसेट कर देगा do_stuff

वेरिएबल्स को हटाने / परेशान करने के लिए इसे निम्नानुसार लागू करें:

unset variablename

क्या वास्तव में यहाँ एकमात्र रास्ता है? ठीक है, मुझे लगता है कि अगर मैं अपने कार्य के लिए वास्तव में लंबे और बदसूरत नाम का उपयोग करता हूं, तो कुछ और के साथ टकराव की संभावना इतनी बड़ी नहीं होगी ...
hugomg

यदि यह समस्या की जांच frist है समारोह मौजूद रहने पर: if type do_stuff >/dev/null 2>&1; then echo "exists"; else echo "dont"; fi
अराजकता

8
यदि do_stuffकिसी अन्य फ़ंक्शन के अंदर उपयोग किया जाता है तो यह काम नहीं करेगा । जब आप उस फ़ंक्शन को कॉल करते हैं, तो आपको मिलेगा bash: do_stuff: command not found। मुझे पता है कि यह बिल्कुल सटीक मामला नहीं है जो ऑप के बारे में बात कर रहा था लेकिन यह इंगित करने लायक है।
बुरहान अली


15

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


1
हां, निजी समारोह के इरादे को इंगित करने के लिए "_" का उपयोग करें, लेकिन इसका विरोधों से कोई लेना-देना नहीं है। किसी को भी "_debug ()" या "_safe_copy ()" की आवश्यकता हो सकती है। यदि ऐसा कुछ है जो संघर्षों से बचने में मदद करता है, तो इसका अंडरस्कोर से कोई लेना-देना नहीं है
Alois Mahdal

3

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

बिल्ली, यह किसी भी संघर्ष नहीं होगा:

_my_foobar_method_91a3b52d990f4a9f9d5d9423ec37b64c () {
    # Custom proprietary logic protected ID 10 T intellectual property copyright clauses.
    cat <<< `echo $(xargs printf <<< "$1")`; }
}

0

जैसा कि एक टिप्पणी में सुझाव दिया गया है, आप एक उप-भाग का उपयोग कर सकते हैं:

#!/bin/bash

. <(
  do_stuff() {
    local version="$1" valid='^\w+$'

    [[ "$version" =~ $valid ]] &&
      cat <<SIDE               || echo "$FUNCNAME: invalid '$version'" >&2
export FOO_${version}_X=17
export FOO_${version}_Y=42
SIDE
  }

  do_stuff 5.0 # FOO_5.0_X is "not a valid identifier"
  do_stuff 5_1
  do_stuff 5_2
)

do_keep() { :; } # just get sure the report below actually works

set | egrep '(do_|FOO_)' |  sed -e 's,^,set:\x09,'

हम केवल उसी साइड इफ़ेक्ट के लिए एक और स्क्रिप्ट का निर्माण करते हैं जिसका एकमात्र साइड इफेक्ट हम चाहते हैं ( hereदस्तावेज़ का उपयोग करके <<SIDE)। फिर हम साथ स्रोत .

'Mise en abime' की शक्ति shआश्चर्य का एक भयावह स्रोत है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.