انجمنهای فارسی اوبونتو
کمک و پشتیبانی => برنامهسازی => نویسنده: IGLOO در 20 آبان 1394، 11:57 قظ
-
سلام
سه تا اسکریپت دارم که اینها رو به صورت دستی اجرا میکنم یعنی هر کدام کارشان تمام شد بعدی رو اجرا میکنم
حالا میخواهم به صورت اتوماتیک پشت سر هم اجرا بشوند به این شرط که حتما اسکریپت قبلی بدون ارور تمام شده باشه
سوالم اینجاست که:
از کجا میتوانم مطمئن شوم که اسکریپت با موفقیت تمام شده؟
دوم: تا وقتیکه اولی تموم نشده دومی اجرا نشه؟
-
اسکریپت اول && اسکریپت دوم && اسکریپت سوم
-
اسکریپت اول && اسکریپت دوم && اسکریپت سوم
احسان آقا این مال دستورات ترمینال هست اگر اسکریپتهای ایشون همه مثلا 20 خطی و توی فایلهای متنی مختلف باشند دیگه جوابگو نیست تا حدودی پس دوست عزیز شما هم اول اسکریپتهای تون را پیوست کنید لطفا.
-
احسان آقا این مال دستورات ترمینال هست اگر اسکریپتهای ایشون همه مثلا 20 خطی و توی فایلهای متنی مختلف باشند دیگه جوابگو نیست تا حدودی پس دوست عزیز شما هم اول اسکریپتهای تون را پیوست کنید لطفا.
میتونند از حلقه استفاده بکنند .
-
چرا جوابگو نیست،میشه بیشتر توضیح بدید؟
مثلا اسکریپت اول چندین خط باشه توی یه فایل جداگونه،اگه همه کامندهایی که توش هستن درست اجرا بشن پس مقدار ؟$ هم باید درستی انجام کار رو برسونه دیگه.
من خودم تا حالا تست نکردم،شایدم نشه.
-
چک لیست
حلقه
شرط درست بودن
ترتیب
اسکریپتهات را طبق بالا تنظیم کن تا کارت راه بیفته دقیقا مثل کاری که علیرضا با زنیتی انجام داده اومده با if گفته اگه شد برو بعدی اگه نشد نوتیفای بده و بسته, شو شما هم شرط بذار اگه شد برو چک لیست بعدی اگه درست جرا نشد حلقه را ادامه نده و نرو چک لیست بعدی و ترتیبش هم با خودت.
@Ehsan-faal
احسان جان توی ترمینال حرف شما صحیح هست مثلا :
pstree > out && cp out out.backup
اما یه اسکریپت مثلا 1000 خطی که یه عالمه سینتکس داره را نمیشه اینجوری کرد اصلا اسکریپتها با دستور /.و sh ران میشن.
مگه اینکه بگی :
sh fs1 && fs2 && fs3
که اینم میگه اگه اجرا شد برو بعدی نمیگه اگه درست اجرا شد برو بعدی .
فکر کن اسکریپت نوشتی تعداد پروسههای ران شده با فلان یوزر را ضرب در دو کنه بده و وقتی رانش میکنه مثلا میگه پروسهها اینا هستند اما عمل ضرب را انجام نمیده در این صورت اسکریپت ران شده اما درست کار نکرده.
اون دستور که دادم فقط میگه اگه خود اسکریپت ران نشد نرو بعدی مثلا میزنی دستور را میگه توی دایرکتوی هوم فایل fs1 نیست و نمیره بعدی ولی اگه بود و رانش کرد میره بعدی و دیگه چک نمی کنه که اسکریپت چی میخواد و چی گفته و ...
ویرایش :
میایم یه تست میزنیم که چطور عمل میکنه ( خودم انجام دادم و نشد )
با دستور زیر یه فایل شل درست میکنیم :
nano fs1.sh
اکنون که ادیتور نانو باز شده خطوط زیر را میزاریم توش :
#!/bin/bash
mkdir 2
cd 2
cp 1 2
اسکریپت میگه توی جایی که هستی پوشهی 2 را بساز و بعد برو توی پوشهی دو و فایل 1 را یک کپی ازش بگیر بذار توی فایل 2.
این اسکریپت مشکل دارد چون فایل 1 ساخته نشده.
یه اسکریت دیگه هم مینویسیم :
nano fs2.sh
و خطوط زیر را توش میذارم :
#!/bin/bash
mkdir 1
میگه یه پوشه با اسم یک بساز.
حالا به جفتشون دسترسی ران میدیم :
sudo chmod u+x fs1.sh fs2.sh
حالا با دستور زیر رانش میکنیم :
sh fs1.sh && sh fs2.sh
ترمینال پیامی میده که میگه :
no such a file or directory
این پیام را که برای فایل 1 میده مربوط به اسکریپت مشکل دار فایل fs1.sh هست. حالا کافی با دستور زیر ببینیم که آیا پوشهی 1 ساخته شده است یا نه اگه ساخته شده باشد در این شرایط && اصلا کار ساز نیست.
ls
خب توی خروجی 1 دیده میشه پس حرف من تا اینجا درسته. ;D ;D
حالا کافی پوشهی یک را با اسکریپت اول پاک کنیم و دستور را دوباره اجرا کنیم :
sudo rm -R fs1.sh 1
و دوباره :
sh fs1.sh && sh fs2.sh
حالا اگه پوشهی یک ساخته شده باشه بازم حرف من درست بوده که مربوط به اجرا شدن خود فایل هست .
ls
خودتون ببنید که پوشهی 1 ساخته نشده چون اسکریپت اول ران نشده. ;D ;D ;D
-
احسان آقا این مال دستورات ترمینال هست اگر اسکریپتهای ایشون همه مثلا 20 خطی و توی فایلهای متنی مختلف باشند دیگه جوابگو نیست تا حدودی
فرقی نداره، همون && جوابگوست.
-
فرقی نداره، همون && جوابگوست.
پست قبلیم را ویرایش کردم لطفا دستورات بالا را بزنید و خروجیها را اینجا بذارید.
من امتحان کردم و نشد اسکریپتها ران میشن اما شرطی بر درست بودنشون نیست.
و $$ زمانی اسکریپت بعدی را ران میکنه که اسکریپت قبلی ران شده باشه حالا چه درست و چه غلط.
-
حسین من تست کردم و جواب همونی بود که فکر میکردم:
ehsan@ehsan-SVF152190X:~/stuff$ cat script1
#!/bin/bash
mkdir firstFolder
cd firstFolder
cp ../some.txt .
ehsan@ehsan-SVF152190X:~/stuff$ cat script2
#!/bin/bash
touch some.txt
و محتویات فعلی:
ehsan@ehsan-SVF152190X:~/stuff$ ls -lh
total 8.0K
-rwxrwxr-x 1 ehsan ehsan 64 Nov 11 20:24 script1
-rwxrwxr-x 1 ehsan ehsan 27 Nov 11 20:25 script2
و حالا اجرا:
ehsan@ehsan-SVF152190X:~/stuff$ ./script1 && ./script2
cp: cannot stat ‘../some.txt’: No such file or directory
و نتایج:
ehsan@ehsan-SVF152190X:~/stuff$ ls -lh
total 12K
drwxrwxr-x 2 ehsan ehsan 4.0K Nov 11 20:28 firstFolder
-rwxrwxr-x 1 ehsan ehsan 64 Nov 11 20:24 script1
-rwxrwxr-x 1 ehsan ehsan 27 Nov 11 20:25 script2
ehsan@ehsan-SVF152190X:~/stuff$ cd firstFolder/
ehsan@ehsan-SVF152190X:~/stuff/firstFolder$ ls -lh
total 0
همه چیز هونطور که گفتم بود.
-
آقا احسان منم همین را گفتم :)
گفتم میره اسکریپت بعدی اما ارور خود اسکریپت را نمیفهمه :
ehsan@ehsan-SVF152190X:~/stuff$ ./script1 && ./script2
cp: cannot stat ‘../some.txt’: No such file or directory
ببین ارور داده اما اخرش رفته دستور بعدی و first folder را ساخته :
drwxrwxr-x 2 ehsan ehsan 4.0K Nov 11 20:28 firstFolder
اما ایشون میخوان همهی اسکریپتها بدون ارور اجرا شن و اگر اروری در کار بود نره سر اسکریپت بعدی که در اینجا میشه از
then exit;
fi
که میگه اگه نشد برو بیرون, استفاده کرد.
-
حق هم با حسین هست و هم با نیکسون!
ببینید درسته && میره سراغ دستور بعد (تا اینجا نیکسون درست میگه)اما اگر اسکریپت اول ارور بده این دستور بدون توجه به ارور میره اسکریپت دوم رو اجرا میکنه.(اینجاست که حسین درست میگه)
-
؟؟؟؟
اسکریپت اول اجرا شده و فلدر رو ساخته و وقتی به قسمتی رسیده که قرار بوده کپی انجام بشه با ارور متوقف شده.
همین ارور باعث شده اسکرپت دوم هم اجرا نشه.
همونطور که میبینید فایل تکست که قرار بوده با اسکریپت دوم بوجود بیاد الان وجود نداره.
حسین اینکه اون فلدر ساخته شده و فایل تکست نه حرفم رو تایید میکنه دیگه.
-
؟؟؟؟
اسکریپت اول اجرا شده و فلدر رو ساخته و وقتی به قسمتی رسیده که قرار بوده کپی انجام بشه با ارور متوقف شده.
همین ارور باعث شده اسکرپت دوم هم اجرا نشه.
همونطور که میبینید فایل تکست که قرار بوده با اسکریپت دوم بوجود بیاد الان وجود نداره.
حسین اینکه اون فلدر ساخته شده و فایل تکست نه حرفم رو تایید میکنه دیگه.
تفاوت مورد من با شما در اینه که شما اسکریپت دومت وابسته به اسکریپت اول هست.
اما اگه اشتباه نکنم این دوستمون اسکریپت هاشون به هم وابسته نیست.
-
خب این هم هیچ تفاوتی ایجاد نمیکنه ها.
بالفرض اسکریپت اول هون قبلی باشه ولی توی دومی فقط یه دستور echo داشته باشیم که یه چیزی بنویسه واسمون.
باز هم به محض گرفتن ارور کل اجرا متوقف میشه و دومی هم اجرا نمیشه.
ضمن اینکه من وابستگی دومی به اولی رو که شما ذکر کردی متوجه نمیشم،چه وابستگی ای دارن؟
-
ممنون از دوستان
اسکریپتهایی که دارم مربوط به خاموش و روشن شدن و پشتیبان گیری یک سرویس هستند منتها در سه فایل داخل اسکریپت موقع اجرا ارورهایی داریم که ممکنه صدمه به روال کار نزنه و در نهایت کارش رو انجام بده! مثل وقتهایی که سیستم میاد بالا ارورهایی مشاهده میکنیم ولی سیستم بالا میاد
حالا میخوام بین این ارورها فرق بزارم و مطمئن شوم که ارور مهمی نبوده یا برعکس مهم هاشو داشته باشم و از ادامه کار جلوگیری کنم.
برای همین دنبال یه راهکاری هستم شبیه $? اما میخواهم کنترل بیشتری داشته باشم
-
خب این هم هیچ تفاوتی ایجاد نمیکنه ها.
بالفرض اسکریپت اول هون قبلی باشه ولی توی دومی فقط یه دستور echo داشته باشیم که یه چیزی بنویسه واسمون.
باز هم به محض گرفتن ارور کل اجرا متوقف میشه و دومی هم اجرا نمیشه.
ضمن اینکه من وابستگی دومی به اولی رو که شما ذکر کردی متوجه نمیشم،چه وابستگی ای دارن؟
اشتباه میکنی!
نگاه کن:
محتویات اسکریپت اول:
#!/bin/bash
mkdir 2
cp ../1.txt > ../2
محتویات اسکریپت دوم:
#/bin/bash
cd 2
touch r.txt
حالا نتیجه اجرا:
fouruhar@fouruhar/mnt/My/m
>>> sh 1.sh && sh 2.sh 21:32.10 Wed Nov 11 2015 >>>
cp: missing destination file operand after ‘../1.txt’
Try 'cp --help' for more information.
محتویات پوشه ۲:
fouruhar@fouruhar/mnt/My/m/2
>>> ls 21:32.58 Wed Nov 11 2015 >>>
r.txt
-
دستور بعد از && تنها پس از اجرای موفقیتآمیز دستور اول اجرا میشه. اگر نخواید وابسته به دستور قبل باشه، بجای && از ; استفاده کنید.
اسکریپتهاتون هم با sh اجرا نکنید، بهشون قابلیت Executable بدید و مستقیم اجرا کنید.
-
دستور بعد از && تنها پس از اجرای موفقیتآمیز دستور اول اجرا میشه. اگر نخواید وابسته به دستور قبل باشه، بجای && از ; استفاده کنید.
اسکریپتهاتون هم با sh اجرا نکنید، بهشون قابلیت Executable بدید و مستقیم اجرا کنید.
پس چرا تو مورد من این اتفاق نیفتاده؟؟؟؟ ](*,) ](*,) ](*,) ](*,) ](*,)
-
پس چرا تو مورد من این اتفاق نیفتاده؟؟؟؟ ](*,) ](*,) ](*,) ](*,) ](*,)
نوشتههای من (که دو خط هم بیشتر نبود) رو خوندید؟ بدون sh تست کردید؟ :)
-
nixoeen جان خودت داری میگی با موفقیت اجرا شه حالا اون اجرا شد دیگه کاری به اسکریپت نداره که توش چی هست . الان کاری شما گفتی را احسان کرد برو خروجیش را ببین.
در ضمن دوستی که سوال پرسید میخواست وابسته به صحیح اجرا شدن اسکریپت قبلی باشه.
-
معلومه که کار داره توش چی هست :)
یه موضوع ساده نیازی به اینقدر بحث نداره که، دوباره چیزی که نوشتم رو میذارم! بخونیدش بجای اینکه حرفهای خودتون رو تکرار کنید:
دستور بعد از && تنها پس از اجرای موفقیتآمیز دستور اول اجرا میشه. اگر نخواید وابسته به دستور قبل باشه، بجای && از ; استفاده کنید.
اسکریپتهاتون هم با sh اجرا نکنید، بهشون قابلیت Executable بدید و مستقیم اجرا کنید.
-
سلام
عملگر کنترلی && نماینده and منطقی است که برای اجرای شرطی، یعنی انجام یک عمل بر اساس موفقیت دستور قبلی استفاده میشود. بنابراین صحیح است که:
دستور بعد از && تنها پس از اجرای موفقیتآمیز دستور اول اجرا میشه. اگر نخواید وابسته به دستور قبل باشه، بجای && از ; استفاده کنید.
اسکریپتهاتون هم با sh اجرا نکنید، بهشون قابلیت Executable بدید و مستقیم اجرا کنید.
اما در انطباق آن با موضوع پرسش دقت لازم به عمل نیامده است.
در اختلاف نظر میان دوستان ما حسین حیدری و ناظر محترم انجمن (nixoeen)، حق با حسین است اما ایشان فقط به طور تجربی (با استناد به نمونه طراحی شدهاش) نظر خود را بیان کرده و نتوانسته با استفاده از مفاهیم اسکریپتنویسی صحت نظر خود را نشان دهد.
از طرف دیگر ناظر محترم نیز با عدم دقت کافی در مفاهیم اسکریپتنویسی، در انطباق یک مفهوم دقیق با مورد سؤال دچار لغزش گردیده و حکم نادرستی را ارایه نموده است و متأسفانه انعطاف لازم را نشان نداده و به مثال تجربی حسین حیدری و آنچه او با بیانی نارسا میگوید اعتنا ندارد و در درستی حکم خود تردید نمیکند چون به درستی اطمینان دارد که «دستور بعد از && تنها پس از اجرای موفقیتآمیز دستور اول اجرا میشه.» و بنابراین متوجه لغزش نمیشود.
گفتیم && عملگر and منطقی است در این معنا فقط اگر وضعیت برگشتی دستور یا عبارت طرف چپ آن موفقیت باشد، دستور یا عبارت سمت راست آن اجرا میگردد. تا اینجا با ناظر محترم اختلاف نظری نیست، غیر از آنکه برای دقت بیشتر، کلمه عبارت را به حکم اولیه ایشان اضافه نمودهام.
از همین کلمه افزوده استفاده کرده و میگویم در اینجا با یک دستور مواجه نیستیم که در آنصورت کاملاً حق با ایشان بود. در این مورد خاص سمت چپ عملگر کنترلی یک اسکریپت است.
بنابراین فقط اگر وضعیت برگشتی از اسکریپت موفقیت باشد، بخش سمت راست عملگر && اجرا میشود. پس لازم است به مفهوم وضعیت برگشتی اسکریپت به طور دقیقتر توجه نماییم.
همانطور که شما دوستان میدانید اسکریپت میتواند از تعدادی دستور و برخی ساختارهای پوسته تشکیل شده باشد و اجرای هر یک از دستورات میتواند موفق یا ناموفق باشد و شکست در اجرای یک دستور به معنای انصراف از بقیه اسکریپت نیست (مگر اینکه نویسنده اسکریپت با استفاده از روشهای مناسب، آنطور تعیین نماید). بنابراین ممکن است برخی فرمانها به طور موفق و بعضی به طور ناموفق اجرا شوند اما در نهایت وضعیت خروج یا کد برگشتی اسکریپت برابر با وضعیت خروج آخرین دستور اجرا شده در اسکریپت خواهد بود. به این ترتیب امکان آن هست که اسکریپت به طور تمام و کمال اهداف تعیین شده را انجام ندهد اما وضعیت خروج موفقیت را برگشت بدهد.
نکتهای که ناظر محترم از نظر دور داشته آن است که در اسکریپت دستورات با استفاده از عملگر && به یکدیگر متصل نمیشوند که اگر یکی از دستورات با عدم موفقیت همراه باشد، اسکریپت خارج شود و وضعیت خروج ناموفق ارایه کند. این کار به عهده نویسنده اسکریپت است. نویسنده میتواند با استفاده از اجرای شرطی در داخل اسکریپت تعیین نماید که در صورت عدم موفقیت فرمان مورد نظر از ادامه اسکریپت صرفنظر شود که در این صورت وضعیت خروج غیر صفر یعنی ناموفق را برگشت میدهد.
(البته نویسنده اسکریپت میتواند با استفاده از exit N کد برگشتی N را مشخص کند).
نتیجه:
پرسش کننده محترم برای رسیدن به مقصود خود باید کد اسکریپت را به طریقی اصلاح نماید که در صورت وقوع هر اتفاق ناخواسته (عدم اجرای هر فرمان یا فرمان مورد نظر ایشان یا رخداد خطا و...) اسکریپت با وضعیت خروج عدم موفقیت خارج شود ( در صورت لزوم روش اصلاح میتواند موضوع پرسش دیگری باشد). آنگاه میتواند راهنمایی دوستان را در مورد استفاده از عملگر کنترلی && به کار ببرد.