برنامه نویسی مقدماتی پوسته لینوکس ( Bash ) : نوشتن اسکریپت های ساده و Output Redirection؛ (I)

برنامه نویسی پوسته لینوکس ( Bash )

یکی از ابزارهایی که همه‌ی محاسباتی کارها باید بدانند، برنامه نویسی پوسته‌ی لینوکس است. در این آموزش قصد نداریم خود برنامه‌نویسی را آموزش دهیم. بلکه یک آموزش کوتاه و کاملاً کاربردی است. خصوصاً که در طول دوره‌های آموزشی وبسایت از آن استفاده خواهیم کرد.
یک اسکریپت پوسته، برنامه‌ای رایانه‌ای است که برای اجرا در پوسته یونیکس که یک مفسر مبتنی بر دستورات خط فرمان است، طراحی میشود. واسطه‌های زیادی بین شما و مغزه‌ی سیستم عامل های یونیکسی وجود دارد. هر کدام از این واسطه‌ها به نوبه خودشان یک زبان اسکریپت نویسی هستند. ما Bash را بررسی میکنیم. پس Bash، پوسته‌ی یونیکس است که هسته یونیکس ارتباط برقرار میکند.

اسکریپت‌های خیلی ساده

چاپ Hello World در خروجی

#! /bin/bash
Echo Hello World

اسکریپت بالا را در یک فایل بنویسید.
خط اول کد، به سیستم میگوید که از کدام برنامه برای باز کردن فایل استفاده کند. علامت #! – هش بنگ است.
Echo هم متن روبرویش را در خروجی چاپ میکند.
از دستور

Touch hello_world.sh

برای ایجاد یک فایل خالی استفاده کنید.
و از دستور

Nano hello_world.sh

برای ویرایش فایل و نوشتن کد بالا در آن استفاده کنید.
برای اجرای برنامه‌ای که نوشتید آنرا فراخوانی کنید :

./hello_world.sh

اگر موفق نشدید از :

Sudo bash ./hello_world.sh

استفاده کنید.

یک اسکریپت ساده دیگر

#! /bin/bash
Tar –cZf ./schoolxtra.tgz /directory_to_be_archived

این دستور دایرکتوری (هر فایلی که دوست دارید) /directory_to_be_archived را با نام schoolxtra.tgz فشرده میکند. امتحان کنید. با این کار یک فایل tar-ball از دایرکتوری گفته شده خواهید داشت.

Output Redirection

یک برنامه کمکی به نام cat وجود دارد – با این برنامه میتوانید محتوایات یک فایل را ببینید- حتی میتوانید محتوایات یک فایل را درون فایل دیگری چاپ کنید.
سه نوع file-discriptor وجود دارد: stdin, stdout & stderr
اگر معنی اینها را نمی‌دانید، ایرادی ندارد. اینها سه تا فایل هستند. Stdin فایلی است که همیشه باز است. به محض اینکه با کیبورد چیزی مینویسید در این فایل قرار میگیرد.
Stdout فایلی است که روی صفحه نمایشگر شما چاپ میشود. و stderr پیامهای خطایی هستند که به صفحه نمایشگر فرستاده میشوند.

Stdin=0
Stdout=1
Stderr=2

Redirect کردن یا هدایت کردن نیز به این معنی است که محتویات این فایلها را به فایل دیگری بفرستید. این سه فایل به صورت پیش فرض همیشه باز هستند. فایلهای استاندارد دیگری هم وجود دارد که باید آنها را باز کنید و خروجیشان را هدایت کنید (فایلهای ۳ تا ۹).
Bash اجازه میدهد که از فرامین استاندارد خروجی (standard output=stdout) (file-discriptor1) استفاده کنید – با استاندارد خروجی، میتوانید به جای چاپ خروجی در کنسول (همان محیط ترمینال) ، آن را در یک فایل بنویسید:

مدلهای زیادی برای چاپ این فایلها در جاهای دیگر وجود دارد.

۱ نشان دهنده‌ی stdout و ۲ نشان دهنده‌:ی stderr است.

۱- بازنویسی روی فایل خروجی ( محتوایات فایل خروجی ( output.txt ) کاملا پاک می‌شود و محتوایات فایل ورودی (input.txt) در آن نوشته میشود). ← stdout2file

#writes input.txt 2 output.txt
cat input.txt > output.txt
#writes whatever you write in terminal to a file called out.txt
Cat > out.txt
Whatever you write here will be printed in out.txt! Just try it

۲- فایل خروجی را بازنویسی نکند ولی متن را بدون بازنویسی به انتهای فایل اضافه کند (تفاوت در > و >> است).

# Redirect stdout to a file.
cat input.txt >> output.txt
# Creates the file if not present, otherwise overwrites it.ls -lR > dir-tree.list
# Creates a file containing a listing of the directory tree.
ls -lR > dir-tree.list

حالات مختلف دیگری وجود دارد که میوانید در زیر بررسی کنید:

۱>filename
# Redirect stdout to file “filename.”
۱>>filename
# Redirect and append stdout to file “filename.”
۲>filename
# Redirect stderr to file “filename.”
۲>>filename
# Redirect and append stderr to file “filename.”
&>filename
# Redirect both stdout and stderr to file “filename.”
# This operator is now functional, as of Bash 4, final release.
M>N
# “M” is a file descriptor, which defaults to 1, if not explicitly set.
# “N” is a filename.
# File descriptor “M” is redirect to file “N.”
M>&N
# “M” is a file descriptor, which defaults to 1, if not set.
# “N” is another file descriptor.

بعلاوه میتوانید file-descriptor یا fd های مختلف را با دستورات زیرببندید:

n<&-

fd ورودی شماره‌ی nام را میبندد- مخصوص فایلهای ورودی است.

۰<&-, <&-

Stdin را میبندد.

n>&-

fd خروجی شماره‌ی nام را میبندد- مخصوص فایلهای خروجی است.

۱>&-, >&-

Stdout را میبندد.

سعی کنید چندتا اسکریپت ساده بنویسید.

پایپ ها، دستورات شرطی و متغیرها موضوع بحث بعدی است.

نظرات