4.2. دستکاری توصیفگر فایل
حال که دانستید چگونه پردازش ورودی و خروجی را با فرستادن به فایلها یا دریافت از آنها اداره کنید، اجازه دهید باز هم کمی آن را جذابتر نماییم.
همانطور که میدانید، تغییر منبع یا مقصد توصیفگرهایفایل برای اشاره به فایلها یا از آنها، امکان پذیر است. همچنین کپی کردن یک FD به دیگری ممکن است. اجازه دهید بستر آزمایش سادهای فراهم کنیم:
$ echo \"I am a proud sentence.\"> file
فایلی به نام
برنامه کاربردی به نام grep وجود دارد که به طور مختصر در فصل قبل دیدهایم. grep شبیه یک نوار لولهای است: میتوانید تقریباً در هر پروژهای آن را به کار ببرید(خواه ایده خوبی باشد یا نباشد). اساساً یک الگوی جستجو را به عنوان یک شناسه دریافت میکند و میتواند چند نام فایل نیز به عنوان شناسه اضافی دریافت نماید. درست مانند cat، برنامه grep نیز اگر نام فایلی را به عنوان شناسه تعیین نکنید از
$ ls house/drawer closet dustbin sofa $ grep-r socks house/house/sofa:socks
در این مثال تخیلی، دایرکتوری به نام house با چند قطعه اثاثیه منزل در آن به عنوان فایل داریم. اگر ما در جستجوی socks(ساکها)ی خود در هر یک از آن فایلها باشیم، grep را به جستجو در دایرکتوری house/ میفرستیم. grep هر چیزی در آنجا را جستجو میکند، هر فایل را باز میکند و محتویات آن را نگاه میکند. در مثال ما، grep ساکها( socks) را در فایل house/sofa پیدا میکند،احتمالاً پنهان شده زیر یک بالش. مثال واقعبینانهتری میخواهید؟ حتماً:
$ grep \"$ HOSTNAME \" /etc/*/etc/hosts:127.0.0.1 localhost Lyndir
اینجا به grep دستور دادهایم هر آنچه
خوب، حال که grep را دریافتید, اجازه بدهید با دستکاری توصیفگرفایل ادامه دهیم. به خاطر میآورید که فایلی به نام
$ grep proud *file:I am a proud sentence.
صحیح! grep جمله ما را در
$ grep proud file \'not a file\'file:I am a proud sentence. grep: not a file: No such file or directory
این دفعه، به grep دستور دادهایم رشته proud را درفایلهای \'
حال، چطور میتوان این جمله grep را به طور کامل خاموش کنیم؟ میتوانیم تمام خروجی که روی ترمینال ظاهر میشود را به جای آن به یک فایل بفرستیم، اجازه بدهید آن را
# Not quite right.... $ grep proud file \'not a file\'> proud.log 2 > proud.log
صحیح به نظر میآید؟ ابتدا از
$ echo \"I am a very proud sentence with a lot of words in it, all for you.\"> file2 $ grep proud file2 \'not a file\'> proud.log 2 > proud.log $ catproud.log grep: not a file: No such file or directory of words in it, all for you.
در اینجا چه اتفاقی رخ داده؟ grep اول فایل
لازم است از داشتن دو توصیفگرفایل مستقل از یکدیگر که روی یک منبع یا مقصد کار کنند، پیشگیری نماییم. میتوانیم با دونسخهای نمودن توصیفگرفایل، این کار را انجام دهیم:
$ grep proud file \'not a file\'> proud.log 2 >& 1
برای درک این مطالب لازم است توجه داشته باشید که: تغییر مسیر فایل از چپ به راست خوانده میشود.این ترتیبی است که BASH آنها را پردازش میکند. اول،
یک FD دونسخهای با دو FD مستقل از یکدیگر که به یک محل اشاره میکنند، متفاوت عمل مینماید. عملیات نوشتن در هر دونسخه دقیقاً همانند است. آشفتگی مربوط به یک FD اشاره کننده به ابتدای فایل در حالیکه دیگری قبلاً آن را ادامه داده وجود نخواهد داشت.
مراقب باشید ترتیب آنها را اشتباه نکنید:
$ grep proud file \'not a file\'2 >& 1 > proud.log
این مثال
$ grep proud file \'not a file\'&> proud.log
این نیز همان
در مستندات گنو: Duplicating File Descriptors, Moving File Descriptors, Opening File Descriptors for Reading and Writing
در پرسش و پاسخهای رایج:
چطور میتوانم چند دستور را در یک مرحله تغییر مسیر بدهم؟چطور میتوانم خروجی \'time\' را به یک متغیر یا فایل تغییر مسیر بدهم؟
چگونه میتوانم از dialog برای دریافت ورودی کاربر استفاده کنم؟