समस्या यह है कि जब देखो निष्पादित होता है तो यह चलता है 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-func
Ubuntu सर्वर 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