دو گزینهای که میتوانند با فرمان 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 ، بین عناصر جای میگیرد
سند اینجا(here document) خصیصهای از ترکیب دستوری(syntactic) پوسته بورن است، که تغذیه دادهها به برنامه را بدون ذخیره آنها در یک فایل خارجی میسر میسازد. این ویژگی به همان خوبی در پوستههای POSIX، Korn و Bash نیز کار میکند.
قالب اصلی عبارت است از:
someprogram <<WORD دادههای شما go hereWORD
در اینجا، someprogram میتواند هر برنامهای باشد که از ورودی استاندارد میخواند (رایجترین آنها cat است)، و WORD میتواند هر کلمه متمایز کنندهای که مایل هستید، باشد. (EOF یک انتخاب رایج است.)
سند اینجا(Here document)ها با این قالب خصوصیات ویژهای دارند:
جایگزینیهای پوسته( از قبیل $variable) در سند اینجا انجام میشوند.
اگر بخواهیم از جایگزینی پوسته اجتناب کنیم، میتوانیم کلمه متمایز کننده را نقلقولی نماییم:
someprogram <<'WORD ' دادههای شما $go `here`WORD
اگر میخواهیم قادر به ایجاد تورفتگی در سنداینجا باشیم، میتوانیم کاراکتر - (خط تیره) را پیشوند کلمه متمایزکننده نماییم:
if ... while .... someprogram <<-WORD this is an indented here documentWORD done fi
در این شکل تمام کاراکترهای tab پیشتاز (فاصلهها خیر!) حذف خواهند شد. هیچگونه مقرراتی برای حذف فاصلههای پیشتاز سطر یا فاصلهها و tabهای همراه هم از ابتدای سطر وجود ندارد. (محدودیتهای قواعد دستوری Makefileها را به خاطر بیاورید، مجاب خواهید شد.)
سنداینجا ها به طور نوعی هنگامی که برنامه فراخوانی میگردد، به وسیله ایجاد فایل موقتی و تغییر مسیر ورودی استاندارد به این فایل، پیادهسازی میشوند.
در bash، گونهای از سنداینجا به نام رشتهاینجا(here string) وجود دارد. این جمع و جور تر است، اما محدودتر نیز میباشد:
read -a octets <<< "$ipaddr"
عملگر <<< نقشی مشابه نقش << در سنداینجا دارد، اما کلمه نگهبان برای اینکه به ما بگوید، کجا ورودی تمام میشود، وجود ندارد. در عوض، عملگر <<< با یک کلمه منفرد دنبال میشود(نقلقول ها دوست شما هستند!). کلمه به اضافه سطر جدید، ورودی استاندارد فرمان میشود.
لولهها امکان ارتباط پردازشها با یکدیگر را فراهم میکنند. همچنین لوله ممکن است به عنوان FIFO (اختصاری برای First In- First Out) شناخته شود.
برتری آنها از کاربرد فایلها به عنوان وسیله ارتباط، آن است که با استفاده از لولهها، پردازشها با یکدیگر همگام میشوند: اگر پردازشی از یک لوله نخواند، پردازش نوشتن در لوله مسدود میشود، و اگر نویسنده وجود نداشته باشد، پردازش خواندن از لوله، مسدود میشود.
مثال زیر نمونهای از لوله نامگذاری شده است، در اینجا به عنوان pipe1 نامیده شده.
cd /tmp mkfifo pipe1
برای ارسال یک پیغام به لوله، از این استفاده کنید:
echo "hello" > pipe1
در این نقطه به نظر میرسد پردازش هنگ شده باشد. پردازش دیگری برای جمعآوری داده در حال اجرا نیست، بنابراین کرنل پردازش را به حالت تعلیق در میآورد. گفته میشود پردازش در این مرحله مسدود(blocked) گردیده است.
امکان دارد در ترمینال دیگری، اطلاعات از لوله جمع آوری گردد، به این شکل:
cat /tmp/pipe1
اکنون توسط cat اطلاعات از لوله خوانده خواهد شد( و در ترمینال نوشته میشود)، و پردازش نویسندهِ مسدودشده برای ادامه یافتن آزاد میشود.
برای برخی اطلاعات بیشتر، پرسش و پاسخ شماره ۸۵ را ببینید.
این مثال کوچکی از مخابره کردن یک پردازش سرویسدهنده با یک پردازش سرویسگیرنده است. سرویسدهنده فرمانها را به سرویسگیرنده ارسال میکند، و سرویس گیرنده هر فرمان را تصدیق میکند:
ادامه مطلبموقع تنظیم noclobber رونویسی محتویات یک فایل موجود توسط عملگر تغییر مسیر > غیرممکن خواهد شد. شاید در حالیکه قصد شما استفاده از عملگر تغییر مسیرِ >> باشد، > را برای تغییر مسیر خروجی یک فرمان به یک فایل موجود تایپ کرده باشید. اینجاست که noclobber به کار میآید، پیشگیری از حذف تصادفی محتوای یک فایل موجود.
ls > list
تنظیم noclobber را امتحان کنید
set -o noclobber
دوباره انجام بدهید
ls > list bash: list: cannot overwrite existing file
اگر تصمیم به رونویسی فایل گرفتهاید، میتوانید روش >| را به کار ببرید. از این قرار:
ls >| list
درست مانند برقرار کردن noclobber، غیرفعال کردن آن نیز میسر است، چنان که با کاربرد عملگر تغییر مسیر > رونویسی بتواند انجام گردد.
set +o noclobber
NoClobber (آخرین ویرایش 2012-09-27 12:53:11 توسط Valentin Bajrami)