বাশের আওতায় চলার জন্য কীভাবে ঘড়ি জোর করবেন


18

সমস্যাটি হ'ল যখন ঘড়িটি কার্যকর করা হয় তখন এটি চলে shএবং আমি এই ত্রুটিটি পাই:

sh: 1: func1: not found

কোডটি এখানে:

#!/bin/bash

func1(){
  echo $1
}

export -f func1

watch func1

আপনি আসলে কমান্ড দিতে পারেন?
cuonglm

@ প্রতিদ্বন্দ্বী 1 এর পরিবর্তে জ্ঞাক আমার 1 লম্বা স্ক্রিপ্ট রয়েছে যাতে আমি জানি না ..
রাশিদ ওসসানা

মানে আপনি কীভাবে আপনার ssh কমান্ডটি চালাচ্ছেন?
cuonglm

@ জ্ঞাক ./bin/myfunc.sh
রচিদ ওসানা

উত্তর:


10

ঠিক আছে, সুতরাং আপনার পদ্ধতির সাথে কয়েকটি সমস্যা আছে।

আপনি একটি ফাংশন রফতানি করছেন যা শেলগুলির মধ্যে পোর্টেবল নয়। watchএটির আদেশগুলি কার্যকর করে /bin/shযা আপনার সিস্টেমে নেই bash। এবং এটি শেল যাই হোক না কেন, এটি ফাংশন রফতানিকে সম্মান করে না, তাই আপনি ত্রুটি পান।

দ্বিতীয়ত, আপনি আপনার আদেশটি এমন কিছুতে পরিবর্তন করতে পারেন watch bash -c 'func1'তবে এটি খুব ভালভাবে কাজ করতে পারে না।
এখানে কারণ হ'ল স্ক্রিপ্ট দ্বারা সেট করা কোনও ভেরিয়েবল ফাংশনের জন্য উপলব্ধ হবে না। আপনি এটির প্রয়োজনমতো রফতানি করতে সক্ষম হতে পারেন তবে এটি অগোছালো হতে শুরু করে।

সবচেয়ে নিরাপদ সমাধান হ'ল func1নিজেই কোনও স্ক্রিপ্ট স্থাপন করা এবং সেই স্ক্রিপ্টটি কল করা।
 

সংক্ষেপে, চেষ্টা করুন:

watch bash -c func1

1
এটি খুব সিপিইউ নিবিড় ক্ষেত্রে ফাংশন সংজ্ঞায়িত করা হয়.bash_profile
বরুণগ

@ ভারুনআগউ, এটি একটি ভাল বিষয়। তবে .bash_profileফাইলটি তুলনামূলকভাবে খালি থাকার পরিবেশে জিনিসগুলি পর্যবেক্ষণ করার জন্য এটি দুর্দান্ত আদেশ । যাইহোক, আমি আমার .bash_aliasesফাইলটিতে থাকা একটি উপনামটি চালাতে চাইনি ( আমার মাধ্যমে উত্সাহিত.bashrc ), তাই আমি -iবাশকেও পতাকাটি যুক্ত করে শেষ করেছি। আমি ভেবেছিলাম এটি কারও সাহায্য করতে পারে:watch bash -ic "func1; alias1; func2; …"
আয়েজজা

কেবল watch -x bash -c my-funcউবুন্টু সার্ভারে আমার জন্য কাজ করুন 16.04 - অন্যরা না করে।
নাম জি ভিউ

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.০৪ এ আমার জন্য এটি কাজ করে - অন্যরা তা করে না। অসংখ্য ধন্যবাদ!
নাম জি ভিউ

4

watchআপনার স্ক্রিপ্টের ভিতর থেকে চালাবেন কেন ? এই শেল স্ক্রিপ্টটি কেন নেই:

$ cat func1 
#!/bin/bash

func1(){
  echo $1
}

func1 $1

... এবং তারপরে এটি চালান ...

$ watch func1 foo
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.