मैं पुरानी परिभाषा के संदर्भ में एक बैश फ़ंक्शन को कैसे फिर से परिभाषित करूं?


13

क्या कोई तरीका है जो मैं इसकी पुरानी परिभाषा के संदर्भ में एक बैश फ़ंक्शन को फिर से परिभाषित कर सकता हूं? उदाहरण के लिए, मैं फ़ंक्शन के प्रस्तावना के लिए कोड के निम्नलिखित ब्लॉक को जोड़ना चाहूंगा command_not_found_handle (),

# Check if $1 is instead a bash variable and print value if it is
local VAL=$(eval echo \"\$$1\")
if [ -n "$VAL" ] && [ $# -eq 1 ]; then
    echo "$1=$VAL"
    return $?
fi

इसे वर्तमान में /etc/profile.d/PackageKit.sh में परिभाषित किया गया है और बैश स्टार्ट-अप स्क्रिप्ट द्वारा खट्टा किया गया है।

इस तरह मैं कमांड प्रॉम्प्ट पर एक पर्यावरण चर के मान को केवल चर नाम लिखकर (और बशर्ते कि ऐसा कोई आदेश मौजूद नहीं है) को क्वेरी कर सकता है। जैसे

user@hostname ~:$ LANG
LANG=en_AU.utf8

मुझे पता है कि मैं वर्तमान परिभाषा को कॉपी और पेस्ट कर सकता हूं और अपने स्वयं के परिवर्तनों को जोड़ सकता हूं ~/.bashrc, लेकिन मैं अधिक सुरुचिपूर्ण तरीके की तलाश कर रहा हूं जिसमें कोड का पुन: उपयोग शामिल है।

मेरे लक्ष्य या कोड सुधार / विस्तार को प्राप्त करने के बेहतर तरीके भी सराहे जाते हैं।


यदि यह सवाल स्टैकवॉयरफ़्लो पर बेहतर अनुकूल होगा, तो क्या कोई इसे माइग्रेट कर सकता है, मुझे नहीं पता कि कैसे।
tmoschou

3
मुझे लगता है कि स्टैक ओवरफ्लो की यह पोस्ट आपके सवाल का जवाब देती है।
Mat

2
इसके बजाय eval, आप अप्रत्यक्ष उपयोग कर सकते हैं:local VAL=$(echo ${!1})
अगली सूचना तक रोक दिया गया।

जवाबों:


14

आप फ़ंक्शन की वर्तमान परिभाषा को प्रिंट कर सकते हैं, और फिर इसे एक evalक्लॉज़ के अंदर फ़ंक्शन परिभाषा में शामिल कर सकते हैं ।

current_definition=$(declare -f command_not_found_handle)
current_definition=${current_definition#*\{}
current_definition=${current_definition%\}}
prefix_to_add=$(cat <<'EOF'
  # insert code here (no special quoting required)
EOF
)
suffix_to_add=$(cat <<'EOF'
  # insert code here (no special quoting required)
EOF
)
eval "command_not_found_handle () {
  $prefix_to_add
  $current_definition
  $suffix_to_add
}"

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

eval "original_$(declare -f command_not_found_handle)"
command_not_found_handle () {
  
  original_command_not_found_handle
  
}

1
चीयर्स, यह मेरे लिए यहां-दस्तावेजों का उपयोग करने के लिए कभी नहीं हुआ, कोई विशेष उद्धरण की आवश्यकता नहीं है। मुझे लगता है कि मैं आपकी पहली विधि को पसंद करता हूं, इससे पूरी परिभाषा को देखना आसान हो जाता है declare -f, लेकिन मुझे उस तरह से पसंद है जैसे आप मूल फंक का नाम बदलते हैं।
tmoschou

0

धन्यवाद @mat, @ डेनिस-विलियम्सन। आपकी टिप्पणियों को पढ़ने के बाद, मुझे यही मिला

eval 'command_not_found_handle () {

    local VAL=$(echo "${!1}")
    if [ -n "$VAL" ] && [ $# -eq 1 ]; then
            echo "$1=$VAL"
            return $?
    fi

    '$(declare -f command_not_found_handle |
    tail -n +3 | head -n -1)'
}'

हालांकि मुझे लगता है कि मैं @ समाधान पसंद करता हूं।

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