সমস্যাটি হ'ল যখন ঘড়িটি কার্যকর করা হয় তখন এটি চলে 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
উবুন্টু সার্ভারে আমার জন্য কাজ করুন 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.০৪ এ আমার জন্য এটি কাজ করে - অন্যরা তা করে না। অসংখ্য ধন্যবাদ!
watch
আপনার স্ক্রিপ্টের ভিতর থেকে চালাবেন কেন ? এই শেল স্ক্রিপ্টটি কেন নেই:
$ cat func1
#!/bin/bash
func1(){
echo $1
}
func1 $1
... এবং তারপরে এটি চালান ...
$ watch func1 foo