कैसे बल को अंडर बैश चलाने के लिए मजबूर करें


18

समस्या यह है कि जब देखो निष्पादित होता है तो यह चलता है shऔर मुझे यह त्रुटि मिलती है:

sh: 1: func1: not found

यहाँ कोड है:

#!/bin/bash

func1(){
  echo $1
}

export -f func1

watch func1

क्या आप दे सकते हैं कि आप वास्तव में क्या चलाते हैं?
क्यूंगलोम

@ गूंज $ 1 के बजाय मेरे पास थोड़ी लंबी स्क्रिप्ट है इसलिए मुझे नहीं पता ..
राचिड औसानाना

मेरा मतलब है कि आपने अपने ssh कमांड को कैसे चलाया?
cuonglm


कृपया देखें:
वेरिफ़ायबल

जवाबों:


10

ठीक है, इसलिए आपके दृष्टिकोण के साथ कुछ समस्याएं हैं।

आप एक फ़ंक्शन निर्यात कर रहे हैं, जो गोले के बीच पोर्टेबल नहीं है। watchअपने आदेशों को निष्पादित करता है /bin/sh, जो आपके सिस्टम पर नहीं है bash। और जो भी खोल है, वह फ़ंक्शन निर्यात का सम्मान नहीं करता है, इसलिए आपको त्रुटि मिलती है।

दूसरे, आप अपनी कमांड को कुछ watch bash -c 'func1'इस तरह से बदल सकते हैं , लेकिन यह भी अच्छी तरह से काम नहीं कर सकता है।
यहाँ कारण यह है कि स्क्रिप्ट द्वारा निर्धारित कोई भी चर फ़ंक्शन के लिए उपलब्ध नहीं होगा। आप इसे अपनी जरूरत के अनुसार निर्यात कर सकते हैं, लेकिन यह गड़बड़ होने लगता है।

सबसे सुरक्षित उपाय यह है कि func1किसी स्क्रिप्ट को अपने पास रखा जाए और उस स्क्रिप्ट को कॉल किया जाए।
 

संक्षेप में, कोशिश करें:

watch bash -c func1

1
यह बहुत ही सीपीयू इंटेंसिव है जो कि फंक्शन फंक्शन में परिभाषित है.bash_profile
वरुणआग

@VarunAgw, यह एक अच्छी बात है। हालांकि, यह एक वातावरण में चीजों की निगरानी के लिए एक महान कमांड है जहां .bash_profileफ़ाइल अपेक्षाकृत खाली है। हालाँकि, मैं एक उपनाम चलाना चाहता था जो मेरी .bash_aliasesफ़ाइल में था ( मेरे माध्यम से सॉर्ट किया.bashrc गया था ), इसलिए मैंने -iध्वज को भी काटने के लिए जोड़ दिया । मैंने सोचा था कि किसी की मदद कर सकता है:watch bash -ic "func1; alias1; func2; …"
aiezza

केवल watch -x bash -c my-funcUbuntu सर्वर 16.04 पर मेरे लिए काम करते हैं - जबकि अन्य नहीं करते हैं।
नाम जी VU

14

के लिए डिफ़ॉल्ट शेल 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 पर है - जबकि अन्य नहीं। अनेक अनेक धन्यवाद!
नाम जी वीयू

4

watchअपनी स्क्रिप्ट के अंदर से क्यों भागना ? यह शेल स्क्रिप्ट क्यों नहीं है:

$ cat func1 
#!/bin/bash

func1(){
  echo $1
}

func1 $1

... और फिर इसे ऐसे ही चलाएं ...

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