محتویات
سیگنالها ابزار اصلی برای ارتباطات میانپردازشی غیر همزمان میباشند. یعنی یک پردازش (A) میتواند به پردازش دیگر (B) بگوید در یک زمانی که به جای پردازش B توسط پردازش A انتخاب شده، کاری را انجام بدهد. (مانند جستجوی یک فایل توسط پردازش B هر چند ثانیه یکبار، این عمل polling نامیده میشود و زمانبندی آن به جای پردازش A توسط پردازش B کنترل میشود.)
سیستم عامل تعداد محدودی سیگنال فراهم مینماید که میتوانند برای گفتن انجام کاری به یک پردازش ارسال بشوند. سیگنالها هیچ اطلاعات اضافی را حمل نمیکنند، تنها اطلاعاتی که پردازش به دست میآورد آن است که سیگنال دریافت شده است. پردازش حتی نمیداند که چه کسی سیگنال را ارسال نموده.
غیر از اینکه پردازش از قبل فرمان خاصی بگیرد، اکثر سیگنالها کُشنده هستند، یعنی عمل پیشفرضی که یک پردازش به مجرد دریافت یک سیگنال انجام خواهد داد، یک خروج بیدرنگ است. (استثناها: SIGCHLD به طور پیشفرض صرفنظر میگردد، SIGSTOP پردازش را متوقف میسازد، و SIGCONT پردازش را از سر میگیرد.) برخی سیگنالها (از قبیل SIGQUIT) نیز باعث میشوند پردازش علاوه بر خروج یک فایل core باقی بگذارد.
یک پردازش ممکن است به جای خروج بواسطه دریافت یک سیگنال، انجام عمل متفاوتی را انتخاب کند. این عمل توسط تنظیم یک گرداننده سیگنال (یا trap) انجام میشود. trap باید قبل از اینکه سیگنال دریافت شود تنظیم شده باشد. وقتی پردازش بواسطه اینکه یک trap برای آن تنظیم شده است یک سیگنال دریافت میکند، گفته میشود سیگنال را در تله انداخته است.
سادهترین کاری که برای انجام دادن با یک پردازش میتواند انتخاب شود، نادیده گرفتن سیگنال است. قاعدتاً یک ایده نامناسب است، مگر اینکه برای یک مقصود خیلی خاص انجام گردد. صرفنظر نمودن از سیگنالها غالباً منجر به پردازشهای فراری میگردد که تمام قدرت CPU را مصرف میکنند.
به طور عمومیتر trapها میتوانند برای جلوگیری کردن از یک سیگنال کُشنده، انجام پاکسازی، و سپس خروج موقرانه تنظیم گردند. برای مثال، برنامهای که فایلهای موقتی ایجاد میکند و مایل است قبل از خروج آنها را حذف نماید. اگر برنامه توسط یک سیگنال مجبور به خروج بشود، قادر نخواهد شد فایلها را حذف کند مگر اینکه سیگنال را در تله بیاندازد.
در یک اسکریپت پوسته، trap فرمان مورد استفاده برای برقرار کردن یک گرداننده سیگنال است. فرمان trap به پنج روش مختلف میتواند استفاده شود:
ادامه مطلب
در عمل کامپیوترها نمیتوانند کاراکترها و علائم را ذخیره کنند، آنها فقط اعداد را ذخیره میکنند. روشهای بیشماری برای نمایش دادن کاراکترهای زبان انسانی( مانند حرف A، علامت به اضافه، وغیره ) به عنوان عدد، وجود دارد، و این امر که روشهای متفاوت بسیار زیادی، واقعاً به کار برده شد، به بینظمی منجر گردیده است.
کامپیوترهای اولیه (حداقل در ایالات متحده) در دو استاندارد برای طرحریزی(نگاشت) کاراکترهای US English به اعداد و بالعکس، به یکدیگر نزدیک شدند: ASCII و EBCDIC. دومی به تدریج تا اواخر قرن بیستم منسوخ گردید و ASCII ( کد استاندارد امریکایی برای تبادل اطلاعات) را به عنوان استاندارد اصلی باقی گذاشت.
مشکل با ASCII آن است که برای زبانهای غیر از انگلیسی، یا حتی برای برخی کلمات انگیسیِ وابسته به مزیتهای انشایی نویسنده، یا شاید نوشته شده با آوا نماها (به عنوان مثال rôle و naïve) خیلی محدود است. ASCII تنها بیست و شش حرف از الفبای انگلیسی (بزرگ و کوچک)، ارقام 0 تا 9، و مقداری نشانهگذاری اصلی را پوشش میدهد -- به طور معمول آنهایی که شما در صفحه کلید US کامپیوتر میبینید. در ماشینهای یونیکسی برای دیدن فهرست آنها میتوانید man ascii را تایپ کنید.
اکثر کامپیوترها از یک بایت هشت بیتی به عنوان واحد ذخیرهشان (یعنی یک دامنه از 0 تا 255 هنگامی که مانند اعداد صحیح غیر منفی بیان میشوند) استفاده میکنند. ASCII فقط کاراکترهای هفت بیتی (0 تا 127) تعریف میکند، یک میرات روزهایی که ارتباطات راه دور دادهها به طور قابل ملاحظهای آهسته و بیشتر مستعد خطا بود. چون ASCII تنها نصف محدوده یک بایت را استفاده میکند، این مطلب فضایی را برای افراد باقی گذاشت که مجموعههای کاراکتری خودشان را داخل یک بایت منفرد تعریف کنند.
(بسیاری از کاربران DOS/Windows مایکروسافت باور دارند که ASCII تمام دامنه 0 تا 255 را با صورتکهای خندان و کاراکترهای ترسیم خطوط و مانند آن پوشش میدهد. این تصور نادرست است. مجموعه کاراکتر معروف DOS در حقیقت IBM code page 437 است، که یکی از چندین فوقمجموعه ASCII میباشد. ASCII خودش منحصر به 127 کاراکتر است.)
ادامه مطلبپرسشهای بسیاری در باره چگونگی استفاده ار یک فایل الگو دریافت نمودهایم، این به معنای یک فایل با placeholder(جای نگهدارنده)هایی در آن است، که میخواهیم در زمان اجرا با کمیتها جایگزین نماییم. چند شکل متفاوت از این پرسش وجود دارد، و به طوریکه انتظار دارید، چند پاسخ متفاوت بر اساس نیازمندیهای واقعی.
اساسیترین نیاز آن است که autoconf گنو به کار میبرد: یک فایل الگوی پیشساخته با مواردی %PLACEHOLDER% در آن، و کمیتهایی در متغیرهای ویژه پوسته که میخواهیم استفاده کنیم. بر این وظیفه بخصوص، sed بسیار خوب منطبق میشود:
sed -e "s/%PLACEHOLDER%/$variable/g" \ -e "s/%FIRSTNAME%/$firstname/g" \ ... "$templatefile" > "$outputfile"
نشانهگذاری %FOO% همان است که autoconf عملاً برای placeholderهایش استفاده میکند، انتخابش به این جهت است. اگر متغیرها بتوانند شامل کاراکترهای
یک شکلِ جایگزین این پرسش عبارت است از، «من یک فایل با بسط پارامترهای پوسته در آن دارم، مانند $foo. من از قبل نمیدانم کدام متغیرها استفاده خواهند شد، بنابراین نمیتوانم دقیقاً یک لیست از تمام آنها دریک فرمان تنومند sed بسازم.» (در اینجا سطرهای جدید داخل متغیرها خیلی بیشتر معمول هستند، اما خوشبختانه آنها مشکلی در راه حلی که ارایه میدهیم نشان نمیدهند.)
این مشکل میتواند به وسیله ساختن یک HereDocument و تغذیه نتیجه به یک پوسته برای بسط یافتن، حل بشود:
{ echo "cat <<EOF" cat "$templatefile" echo "EOF" } | sh > "$outputfile"
توجه: اگر یک نتیجه غیرمنتظره که شامل EOF در انتهای خروجی است، به دست میآورید، احتمالاً فایل الگوی شما فاقد کاراکتر سطرجدید در انتها میباشد.
به خاطر بیاورید تا زمانی که رشته نگهبان (در موقعیت ما EOF) در سطر اول نقلقولی نشده باشد در بدنه یک HereDocument جایگزینیها انجام میشوند. ما در اینجا از این مطلب بهرهگیری میکنیم.
همچنین، توجه نمایید که جایگزینی در یک پوسته جدید sh (یا bash یا ksh، هر چه که شما لازم دارید) انجام میشود، نه در پوسته جاری. بنابراین، هر متغیری که شما میخواهید استفاده کنید باید export شده باشد.
چون هر جایگزینی فرمان در فایل الگو به عنوان کُد پوسته اجرا خواهد شد، اهمیت دارد که هر فایل الگویی که به این طریق استفاده میشود تحت کنترل شما باشد، و توسط یک کاربر تولید نشده باشد. به شما هشدار داده میشود.
فایلهای الگو (آخرین ویرایش 2010-08-26 15:12:58 توسط cei-gla-cpk2)
دو گزینهای که میتوانند با فرمان set تنظیم بشوند و تا اندازهای برای کاربر جالب خواهند بود، "-o vi" و "-o emacs" میباشند. همچون تمام فرمانهای ویرایش محیط اینها میتوانند در اعلان فرمان تایپ بشوند یا در فایل مناسب درج گردند.
در محیط bash این وضعیت معمولاً حالت پیشفرض ویرایش است و به معنای آن است که شما برای حرکت اشارهگر، بریدن و چسباندن متن، یا خنثی نمودن ویرایش قادر به استفاده از فرمانهایی هستید که در Emacs وجود دارند (تعریف شده در کتابخانه Readline) .
set-o-vi-emacs (آخرین ویرایش 2013-07-15 13:16:33 توسط static-173-71-130-68)
متغیر IFS در پوستهها(Bourne، POSIX، ksh، bash) به عنوان جداکننده فیلد ورودی (یا جداکننده داخلی فیلد) به کار میرود. در اصل، رشتهای از کاراکترهای خاصی است، که موقع تجزیه یک سطر از ورودی، باید با آنها به عنوان جداکننده مابین کلمات/فیلدها، رفتار بشود.
مقدار پیشفرض IFS، فاصله، tab، سطرجدید است. (یک رشته سه کاراکتری.) اگر IFS برقرار نباشد(unset)، مانند آن عمل میکند که به این مقدار پیشفرض تنظیم شده باشد. (این احتمالاً برای سادگی در پوستههایی است که از ترکیب دستوری $'...' برای کاراکترهای خاص پشتیبانی نمیکنند.) اگر IFS به یک رشته تهی تنظیم گردد (که خیلی متفاوت با عدم برقرار بودن--unset-- آن است!)، تجزیهای انجام نخواهد شد.
این متغیر در چند محل مختلف به کار میرود. با تعابیر کمی متفاوت:
در فرمان read، در صورتیکه چندین نام متغیر به عنوان شناسه فرمان تعیین شده باشند، IFS برای تجزیه سطر ورودی به طریقی که هر متغیر یک فیلد منفرد از ورودی را دریافت نماید، به کار میرود. (اگر فیلدهای بیشتری نسبت به متغیرها وجود داشته باشد، آخرین متغیر تمام فیلدهای باقیمانده را دریافت میکند.)
موقع انجام تفکیک کلمه در یک بسط نقلقولی نشده، IFS برای تجزیه محتوای بسط به چندین کلمه، به کار میرود.
موقع اجرای بسط "$*" یا "${array[*]}" (* همان @ نیست، و نقلقولی شده است -- یادداشت ویژه را ببینید!)، برای ساختن رشته خروجی نهایی، کاراکتر اول از IFS ، بین عناصر جای میگیرد