बैश फंक्शन को ओवरराइड होने से कैसे बचाएं?


13

में bashखोल, हम एक समारोह को परिभाषित कर सकते fके साथ

f(){ echo Hello; }

और फिर इसे बिना किसी त्रुटि या चेतावनी संदेशों के, पुनः लोड / ओवरराइड करें

f(){ echo Bye; }

मेरा मानना ​​है कि इस तरह से कार्यों को ओवरराइड होने से बचाने का एक तरीका है।


2
चर के साथ के रूप में ही, साथ typeset -r: typeset -rf f
मस्जिद

3
याreadonly -f f
मोसवी

जवाबों:


25

आप fका उपयोग कर readonly -f fया declare -g -r -f f( readonlyके बराबर है declare -g -r) केवल पढ़ने के लिए एक समारोह के रूप में घोषित कर सकते हैं । यह -fइन अंतर्निहित उपयोगिताओं का विकल्प है जो उन्हें fचर के बजाय एक फ़ंक्शन के नाम के रूप में कार्य करता है f

$ f(){ echo Hello; }
$ readonly -f f
$ f(){ echo Bye; }
bash: f: readonly function
$ unset -f f
bash: unset: f: cannot unset: readonly function
$ f
Hello

जैसा कि आप देख सकते हैं, फ़ंक्शन को पढ़ना-न केवल इसे ओवरराइड होने से बचाता है, बल्कि इसे अनसेट (पूरी तरह से हटाए जाने) से भी बचाता है।


वर्तमान में (के रूप में bash-5.0.11), केवल-पढ़ने के लिए एक फ़ंक्शन को संशोधित करने की कोशिश कर रहा है यदि errexitशेल विकल्प ( set -e) का उपयोग कर रहा है तो शेल को समाप्त नहीं करेगा । चेट, bashमेंटेनर, का कहना है कि यह एक निरीक्षण है और है कि यह अगली फिल्म के साथ बदल जाएगा।


फ़ंक्शन को ओवरराइड करने का प्रयास संदेश bash: f: readonly functionऔर गैर-शून्य स्थिति कोड का उत्पादन करता है , लेकिन errexitविकल्प सक्षम होने पर बाहर नहीं निकलता है ।
kyb

@kyb मैंने इस पर भी गौर किया। मुझे यकीन नहीं है कि यह एक बग है bash, लेकिन मैं bashमेलिंग सूचियों में से एक पर सुनिश्चित करने के लिए कहूंगा।
Kusalananda

जब आप इस व्यवहार के बारे में सुनिश्चित होंगे, तो कृपया अपना उत्तर अपडेट करें।
kyb

1
@kyb स्टीफन चेज़ेलस और ग्रेग वुल्जेज दोनों ने उस प्रश्न पर वज़न किया, जो दोनों के लिए प्रशंसनीय स्पष्टीकरण के साथ था। स्टीफन सुझाव देते हैं कि bashकेवल तभी बाहर निकलता set -eहै जब POSIX के लिए इसकी आवश्यकता होती है (और readonly -fPOSIX नहीं है)। ग्रेग बताते हैं कि bashमैनुअल कभी भी "फंक्शन डिक्लेरेशन में फेल्योर" का जिक्र नहीं करता, क्योंकि errexitएक एग्जिट को ट्रिगर करने का कारण (जब तक कि फंक्शन डिक्लेरेशन कंपाउंड कमांड के रूप में गिना नहीं जाता है, जो उसे पूरा यकीन है कि ऐसा नहीं होता)। : धागा यहाँ चल रही है lists.gnu.org/archive/html/help-bash/2019-09/msg00039.html
Kusalananda

@kyb मैं यह भी देख रहा हूं कि आप कभी भी errexitया set -eअपने प्रश्न के बारे में कुछ नहीं कहते हैं ।
Kusalananda
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.