سلام
عملگر کنترلی && نماینده and منطقی است که برای اجرای شرطی، یعنی انجام یک عمل بر اساس موفقیت دستور قبلی استفاده میشود. بنابراین صحیح است که:
دستور بعد از && تنها پس از اجرای موفقیتآمیز دستور اول اجرا میشه. اگر نخواید وابسته به دستور قبل باشه، بجای && از ; استفاده کنید.
اسکریپتهاتون هم با sh اجرا نکنید، بهشون قابلیت Executable بدید و مستقیم اجرا کنید.
اما در انطباق آن با موضوع پرسش دقت لازم به عمل نیامده است.
در اختلاف نظر میان دوستان ما حسین حیدری و ناظر محترم انجمن (nixoeen)،
حق با حسین است اما ایشان فقط به طور تجربی (با استناد به نمونه طراحی شدهاش) نظر خود را بیان کرده و نتوانسته با استفاده از مفاهیم اسکریپتنویسی صحت نظر خود را نشان دهد.
از طرف دیگر ناظر محترم نیز با عدم دقت کافی در مفاهیم اسکریپتنویسی، در انطباق یک مفهوم دقیق با مورد سؤال دچار لغزش گردیده و حکم نادرستی را ارایه نموده است و متأسفانه انعطاف لازم را نشان نداده و به مثال تجربی حسین حیدری و آنچه او با بیانی نارسا میگوید اعتنا ندارد و در درستی حکم خود تردید نمیکند چون به درستی اطمینان دارد که
«دستور بعد از && تنها پس از اجرای موفقیتآمیز دستور اول اجرا میشه.» و بنابراین متوجه لغزش نمیشود.
گفتیم && عملگر and منطقی است در این معنا فقط اگر وضعیت برگشتی دستور یا عبارت طرف چپ آن موفقیت باشد، دستور یا عبارت سمت راست آن اجرا میگردد. تا اینجا با ناظر محترم اختلاف نظری نیست، غیر از آنکه برای دقت بیشتر، کلمه عبارت را به حکم اولیه ایشان اضافه نمودهام.
از همین کلمه افزوده استفاده کرده و میگویم در اینجا با یک دستور مواجه نیستیم که در آنصورت کاملاً حق با ایشان بود. در این مورد خاص سمت چپ عملگر کنترلی یک اسکریپت است.
بنابراین فقط اگر وضعیت برگشتی از اسکریپت موفقیت باشد، بخش سمت راست عملگر && اجرا میشود. پس لازم است به مفهوم وضعیت برگشتی اسکریپت به طور دقیقتر توجه نماییم.
همانطور که شما دوستان میدانید اسکریپت میتواند از تعدادی دستور و برخی ساختارهای پوسته تشکیل شده باشد و اجرای هر یک از دستورات میتواند موفق یا ناموفق باشد و شکست در اجرای یک دستور به معنای انصراف از بقیه اسکریپت نیست (مگر اینکه نویسنده اسکریپت با استفاده از روشهای مناسب، آنطور تعیین نماید). بنابراین ممکن است برخی فرمانها به طور موفق و بعضی به طور ناموفق اجرا شوند اما در نهایت وضعیت خروج یا کد برگشتی اسکریپت برابر با وضعیت خروج آخرین دستور اجرا شده در اسکریپت خواهد بود. به این ترتیب امکان آن هست که اسکریپت به طور تمام و کمال اهداف تعیین شده را انجام ندهد اما وضعیت خروج موفقیت را برگشت بدهد.
نکتهای که ناظر محترم از نظر دور داشته آن است که در اسکریپت دستورات با استفاده از عملگر && به یکدیگر متصل نمیشوند که اگر یکی از دستورات با عدم موفقیت همراه باشد، اسکریپت خارج شود و وضعیت خروج ناموفق ارایه کند. این کار به عهده نویسنده اسکریپت است. نویسنده میتواند با استفاده از اجرای شرطی در داخل اسکریپت تعیین نماید که در صورت عدم موفقیت فرمان مورد نظر از ادامه اسکریپت صرفنظر شود که در این صورت وضعیت خروج غیر صفر یعنی ناموفق را برگشت میدهد.
(البته نویسنده اسکریپت میتواند با استفاده از exit N کد برگشتی N را مشخص کند).
نتیجه:
پرسش کننده محترم برای رسیدن به مقصود خود باید کد اسکریپت را به طریقی اصلاح نماید که در صورت وقوع هر اتفاق ناخواسته (عدم اجرای هر فرمان یا فرمان مورد نظر ایشان یا رخداد خطا و...) اسکریپت با وضعیت خروج عدم موفقیت خارج شود ( در صورت لزوم روش اصلاح میتواند موضوع پرسش دیگری باشد). آنگاه میتواند راهنمایی دوستان را در مورد استفاده از عملگر کنترلی && به کار ببرد.