समस्या यह है कि जब देखो निष्पादित होता है तो यह चलता है shऔर मुझे यह त्रुटि मिलती है:
sh: 1: func1: not found
यहाँ कोड है:
#!/bin/bash
func1(){
echo $1
}
export -f func1
watch func1
समस्या यह है कि जब देखो निष्पादित होता है तो यह चलता है shऔर मुझे यह त्रुटि मिलती है:
sh: 1: func1: not found
यहाँ कोड है:
#!/bin/bash
func1(){
echo $1
}
export -f func1
watch func1
जवाबों:
ठीक है, इसलिए आपके दृष्टिकोण के साथ कुछ समस्याएं हैं।
आप एक फ़ंक्शन निर्यात कर रहे हैं, जो गोले के बीच पोर्टेबल नहीं है। watchअपने आदेशों को निष्पादित करता है /bin/sh, जो आपके सिस्टम पर नहीं है bash। और जो भी खोल है, वह फ़ंक्शन निर्यात का सम्मान नहीं करता है, इसलिए आपको त्रुटि मिलती है।
दूसरे, आप अपनी कमांड को कुछ watch bash -c 'func1'इस तरह से बदल सकते हैं , लेकिन यह भी अच्छी तरह से काम नहीं कर सकता है।
यहाँ कारण यह है कि स्क्रिप्ट द्वारा निर्धारित कोई भी चर फ़ंक्शन के लिए उपलब्ध नहीं होगा। आप इसे अपनी जरूरत के अनुसार निर्यात कर सकते हैं, लेकिन यह गड़बड़ होने लगता है।
सबसे सुरक्षित उपाय यह है कि func1किसी स्क्रिप्ट को अपने पास रखा जाए और उस स्क्रिप्ट को कॉल किया जाए।
संक्षेप में, कोशिश करें:
watch bash -c func1
.bash_profile
.bash_profileफ़ाइल अपेक्षाकृत खाली है। हालाँकि, मैं एक उपनाम चलाना चाहता था जो मेरी .bash_aliasesफ़ाइल में था ( मेरे माध्यम से सॉर्ट किया.bashrc गया था ), इसलिए मैंने -iध्वज को भी काटने के लिए जोड़ दिया । मैंने सोचा था कि किसी की मदद कर सकता है:watch bash -ic "func1; alias1; func2; …"
watch -x bash -c my-funcUbuntu सर्वर 16.04 पर मेरे लिए काम करते हैं - जबकि अन्य नहीं करते हैं।
के लिए डिफ़ॉल्ट शेल watchहै /bin/sh। गोले निर्यात किए गए चर या कार्यों को अन्य प्रकार के खोल से विरासत में नहीं मिलेंगे।
आपके सिस्टम सिमलिंक नहीं है, तो /bin/shकरने के लिए /bin/bash(या अपने वर्तमान खोल) तो आप निर्देश दे सकते हैं watchका उपयोग करके अपने खोल exec करने के लिए -xया --exec:
watch -x bash -c "my_func"
या
watch --exec bash -c "my_func"
यह अलग है watch bash -c "test_watch"(छोड़कर --exec) के रूप में यह /bin/shबच्चे की प्रक्रिया को स्पॉन करने के लिए उपयोग नहीं करता है (इस मामले में bash), bashनीचे सभी तरह से बनाए रखता है । जैसा कि अन्य जवाबों में दिया गया है, यह गड़बड़ हो सकता है अगर निर्यात कार्य जो मौजूदा पर्यावरण के लिए बहुत अधिक हैं (यानी अन्य चर या कार्यों की आवश्यकता है)।
एक उदाहरण:
test_watch() { echo 'Working!'; }
export -f test_watch
watch --exec bash -c "test_watch"
परिचित देता है
Every 2.0s: bash -c test_watch Thu Mar 31 11:15:56 2016
Working!
watch -x bash -c my-funcहां यह काम मेरे लिए उबंटू सर्वर 16.04 पर है - जबकि अन्य नहीं। अनेक अनेक धन्यवाद!
watchअपनी स्क्रिप्ट के अंदर से क्यों भागना ? यह शेल स्क्रिप्ट क्यों नहीं है:
$ cat func1
#!/bin/bash
func1(){
echo $1
}
func1 $1
... और फिर इसे ऐसे ही चलाएं ...
$ watch func1 foo