جولة في طرفية لينكس.

مقال تدربي موجه لمن يريد معرفة طرفية لينكس و أساسياتها.

شاهينمنذ سنتين

مقدمة:

لربما تكون ترغب بتجربة لينكس، لكن تلك النافذة السوداء التي بها مؤشر نص يومض منتظرا منك كتابة بعض الأوامر هو ما يمنعك أو يثبط من حماسك لتجربة لينكس، لذلك دعني أعرفك بما يسمى بـ' الطرفية ' ولنأخذ جولة خفيفة مع بعض أوامرها ( المقال سيكون عبارة عن مقال تدريبي خطوة بخطوة، لذلك بدل القراءة فقط سيكون من الأفضل لو تقوم بنفس الأوامر و تجرب بنفسك ).
ملاحظة: لست بحاجة لتثبيت نظام لينكس حتى تتابع المقال، كل ما تحتاجه هو حساب غوغل و متصفح، و المقال موجه لكل من يرغب بالتعرف على الطرفية سواء كان يستخدم - أو يرغب باستخدام - لينيكس، أو حتى من لديه فضول اتجاه الطرفية و سطر الأوامر فقط.

شرح المفاهيم:

ماهي الطرفية - Terminal -؟:

الطرفية هو جهاز كان يُستخدم قديما للتعامل مع الأنظمة الحاسوبية، حيث يُمكِّن المستخدم من إدخال البيانات إلى الحاسوب أو عرضها منه، و عندما أقول أنه جهاز فأنا أعني ذلك حرفيا فهو منفصل تماما عن الحاسوب و يمكنك أن تكتب في غوغل Terminal و ستظهر لك صورة للجهاز.

طرفية حاسوب

محاكي الطرفية - Terminal Emulator -:

مع تطور الأنظمة الحاسوبية أصبحت الطرفية مدمجة مع نظام الحاسوب، مما يعني لا حاجة لجهاز الطرفية لكن حتى نتعامل معها سنحتاج أين نتعامل معها و هنا يأتي دور محاكي الطرفية، و هو تلك النافذة السوداء التي تنتظر منك كتابة بعض الأوامر لها حتى تنفذها، و كما يوحي إسمه هو مجرد محاكي للجهاز الحقيقي غير أنه يقدم لنا خدمات جديدة أخرى مثل إختصارات لوحة المفاتيح و نوع خط الكتابة و غيرها ( في أغلب الأحيان يتم إستخدام لفظ الطرفية للدلالة على محاكي الطرفية - لأنه الطرفية الحقيقية لم تعد موجودة حاليا - و هذا ما سيتم إعتماده في هذا المقال ).

جيد، أنت الآن تعرف ماهي الطرفية، لكن يلزمك معرفة شيء آخر و هو أن الطرفية ليست من تقوم بتنفيذ الأوامر، فالطرفية مجرد مكان لإدخال الأوامر...إذا من يقوم بتنفيذها؟ إنها الصَّدفة ( Shell ).

ماهي الصَّدفة - Shell -؟:

هو برنامج يعمل على تفسير الأوامر - يعرف أيضا بإسم مفسر أوامر ( Command Interpreter ) - التي تكتبها و يقدمها للنظام لتنفيذها.
 

لتبسيط الفهم أكثر هذا مخطط بسيط يشرح كل شيء:

Terminal → Shell → OS

 

كتابة الأوامر في الطرفية ← الصَّدفة تُفسر الأوامر للنظام ← تنفيذ النظام للأوامر.

و الآن بعد كل هذه المقدمة الطويلة لنبدأ جولتنا المُنتظرة، قم بفتح هذا الموقع Google Cloud Shell و انتظر ليتم إعداد البيئة.

بداية الجولة:

أنت الآن في الموقع و الصفحة مُقسَّمة إلى نصفين، يمكن تجاهل الجزء العلوي لأننا سنعتمد على النصف السفلي و تلك هي الطرفية.
لا شك أنه لديك سطر بهذا الشكل:

username@cloudshell:~$

هذا السطر هو المحث - يحث على كتابة الأوامر -، و عند ظهوره يعني أن الصدفة جاهزة لتلقي الأوامر، و أغلب المحثات تُكتب من هذا الشكل:

username@hostname:working_directory$

username: إسم مستخدم الحاسوب في حالتنا سيكون جزء من إيمايل غوغل
hostname: إسم الحاسوب أو الجهاز
working_directory: مجلد العمل الحالي و يكون على شكل مسار مثلا:

~/user/Downloads

~: هذه العلامة تعني أننا في المجلد الرئيسي - يعرف بإسم home -.
و في الأخير علامة الدولار تعني أننا نستخدم صدفة bash ( هناك العديد من الصدفات لكن أغلب توزيعات لينكس تستخدم صدفة bash ).

لنكتب بعض الأوامر:

ملاحظة: قبل أن نبدأ أريد أن أنبهك على إختصارين كثيرا ما ستحتاج لهم الأول هو زر Tab إذا بدأت بكتابة أمر أو إسم ملف ما و كان طويلا إضغط على Tab حتى تُكمل الطرفية الكتابة نيابة عنك إذا كان ملفين يشتركان في بداية الإسم بالأحرف نفسها تأكد من الكتابة حتى تتجاوز الأحرف المتشابهة، و الإختصار الثاني هو ctrl + C وهذا يقوم بإلغاء أي شيء يعمل على الطرفية إستخدمه إذا ما صادفك مشكل عليها.
 
ينبغي أن تعلم أن الطرفية لها نفس هدف الواجهات الرسومية، و هو التعامل مع النظام، الواجهات الرسومية تسهل علينا القيام ببعض المهام أما الطرفية فهي موجهة للقيام بالمهام الصعبة أو المعقدة كما أنها تقدم لنا معلومات أكثر لما يحصل في النظام مما يسهل علينا حل المشاكل.

في طرفية المتصفح أنت لا تعلم أي نظام يعمل به الحاسوب الذي تستخدمه و لا يوجد واجهة رسومية لمعرفة ذلك، لكن إن أدخلت الأمر uname و ضغطت على enter سيظهر لك إسم النظام:

username@cloudshell:~$ uname
Linux

كما ترى نحن على نظام Linux.

حتى تعرف أي مستخدم أنت حاليا، أدخل whoami:

username@cloudshell:~$ whoami
username

حسنا، لا شك أنك تريد أن ترى ماذا يوجد بالمجلد الحالي فأنت معتاد على فتح مدير الملفات و ترى كل الملفات، في الطرفية نستخدم الأمر ls - و الذي يعني list ( عدِّد ) -:

username@cloudshell:~$ ls
README-cloudshell.txt

ملاحظة: الأوامر التي مخرجاتها طويلة لن أقوم بإرفاق مخرجاتها مثل الأمرين التاليين.

يوجد لدينا ملف نصي، دعنا نلقي نظرة على ما بداخلة، أدخل الأمر cat - إختصار لـconcatentate و هو أمر يقوم بربط النصوص التي بداخل الملفات و طبعها - و بعده أضف إسم الملف:

username@cloudshell:~$ cat README-cloudshell.txt

هناك مفهوم خاص بالأوامر و هو الـOptions ( الخيارات )، حيث يمكنك تعديل خيارات الأوامر حتى تتحكم أكثر بمخرجاتها، فمثلا لنقل أنك تريد أن ترى ترقيم الأسطر للملف النصي السابق إذا أدخل الأمر السابق نفسه لكن أضف n- بعده:

username@cloudshell:~$ cat -n README-cloudshell.txt 

قد تكون مندهشا كيف لي أن أعرف، لا تندهش فهذا أمر بسيط فكل الأوامر لديها خيار أساسي تضيفه مع الأمر و هو help--، يقوم بعرض أغراض الأمر و كل الخيارات المتاحة:

username@cloudshell:~$ cat --help

كما ترى الخيار n- يعني ترقيم كل السطور المُخرجة.

هناك طريقة أخرى لعرض معلومات عن أمر ما، و ذلك باستعمال الأمر man - كتيب التعليمات manuel -:

username@cloudshell:~$ man cat

هذه الطريقة تعرض المعلومات بشكل منظم أكثر، إضغط على Q للخروج.

ألا تبدو طرفيتك ممتلئة بعض الشيء؟ لربما ترغب بمسح ماهو مكتوب، إذا كنت كذلك أدخل الأمر clear:

username@cloudshell:~$ clear

ملفنا الحالي ليس به أي شيء لذلك دعنا نضيف له مجلد جديد، أدخل الأمر mkdir - أنشئ مجلد Make Directory - ولا تنسى كتابة إسم المجلد بعد الأمر:

username@cloudshell:~$ mkdir New

الآن أعرض الملفات الحالية بالأمر ls و سترى المجلد الجديد:

username@cloudshell:~$ ls
New  README-cloudshell.txt

إسم المجلد مكتوب بلون مغاير لأنه مجلد.

للنتقل للمجلد الجديد باستخدام الأمر Change Directory - cd -:

username@cloudshell:~$ cd New
username@cloudshell:~/New$

كما ترى قبل علامة الدولار تغير الرمز من ~ إلى New/~، و لذلك لأننا إنتقلنا للمجلد New.

الأمر cd يأتي بعده مسار لمجلد معين، و بالتحدث عن المسارات يمكن طباعة مسار المجلد الحالي عن طريق الأمر pwd - إطبع ( مسار ) مجلد العمل الحالي Print Working Directory -:

username@cloudshell:~/New$ pwd
/home/username/New

بما أن المجلد New كان ضمن المجلد السابق فلم يكن علينا كتابة كل هذا المسار.

للعودة للمجلد السابق أدخل الأمر التالي:

username@cloudshell:~/New$ cd ..
username@cloudshell:~$

رمز النقطتين .. هو الـParent Directory - المجلد الأب - أي المجلد الذي يضم المجلد الحالي.

لا نحتاج المجلد الحالي لذلك لنقم بحذفه عن طريق الأمر rmdir - أزِل المجلد Remove Directory -:

username@cloudshell:~$ rmdir New

الأمر rmdir يقوم بحذف المجلدات الفارغة و سنرى بعد قليل كيف نحذف المجلدات التي تحوي ملفات، لكن ما رأيك الآن أن ننشئ ملف نصي؟ أدخل الأمر التالي:

username@cloudshell:~$ touch file.txt

الأمر touch يستخدم للتعديل على الطوابع الزمنية الخاصة بملف ما، لكنه يقوم بإنشاء الملف إذا لم يكن موجودا مسبقا.

الملف النصي الذي أنشأناه فارغ و يمكنك التأكد بإخال الأمر cat:

username@cloudshell:~$ cat file.txt

حتى يمكننا الكتابة على الملف سنحتاج لمحرر نصوص، و يوجد لدينا واحد مسبقا و هو nano:

username@cloudshell:~$ nano file.txt

الآن يمكنك أن تكتب ما تريد، مثلا عندي كتبت:

echo 'Hello, Terminal!' 

بما أننا سنحتاج هذا النص لاحقا، سيكون من الأفضل لو تكتب نفس ما كتبتُه، بعدها إضغط ctrl + S للحفظ و ctrl + X للخروج من المحرر.

الآن لو أدخلنا الأمر cat سيظهر لنا ما كتبناه:

username@cloudshell:~$ cat file.txt
echo 'Hello, Terminal!'

لننشئ مجلد، و ننقل إليه الملفات النصية:

username@cloudshell:~$ mkdir Texts

لنقل ملف لمجلد نستعمل الأمر mv - نقل Move - نكتب بعده مسار ( أو إسم ) الملف و مسار ( أو إسم ) المجلد ( لا تكتب الأمر سنستخدم طريقة أفضل في حالتنا هذه ):

username@cloudshell:~$ mv file.txt Texts

بما أن كلا من المجلد Texts و الملف file.txt ضمنا المجلد الحالي الذي نحن فيه نكتفي بكتابة إسم كلا منها فقط.

بقي لدينا ملف آخر لنقله سنقوم بنفس الأمر:

username@cloudshell:~$ mv README-cloudshell.txt Texts

أليس الأمر فيه بعض التكرار؟ ماذا لو كان لدينا 100 ملف نصي؟ هل نقوم بـ100 أمر؟ طبعا لا، إن كنت ترغب في التعامل في العديد من الملفات من النفس النوع سنستخدم الأنماط ( Patterns ).
تُستخدم الأنماط لتحديد ملفات لها إسم بنمط معين مثلا ملفاتنا النصية دائما ما تنتهي بـtxt. لذلك سنُدخل الأمر التالي لنقل أي ملف له إسم من هذا النمط:

username@cloudshell:~$ mv *.txt Texts

الرمز * يعني : 0 حرف أو أكثر.

الملف النصي الأول - الذي وجدناه مسبقا - ليس خاصا بنا، سيكون من الجيد لو إستطعنا إرجاعه هل تعلم كيف؟ ستحتاج إلى مسار الملف:

username@cloudshell:~$ mv /Texts/README-cloudshell.txt .

هذه المرة أدخلنا مسار الملف، لأن الملف غير موجود في نفس المجلد الذي نحن فيه، و النقطة مع الأخير تعني Current Directory - المجلد الحالي -، لكن ماذا لو أردنا حقا نسخة من هذا الملف النصي حتى يمكننا التعديل عليها ( دون المساس بالأصلية )، هنا سنحتاج للأمر cp - نسخ Copy -:

username@cloudshell:~$ cp README-cloudshell.txt Texts

بعد الأمر يأتي إسم ( أو مسار إن لم يكن ضمن المجلد الحالي ) الملف الذي نريد نسخه، ثم أين نريد نسخه و الذي قد يكون إسما أو مسارا حسب الحالة لكن كما قلت مسبقا في حالتنا المجلد Texts ضمن مجلدنا الحالي لذا سنكتفي بالإسم فقط ( أو يمكنك كتابته من هذا الشكل /Texts ).

و الآن للنتقل لمجلد Texts و نرى ما لدينا:

username@cloudshell:~$ cd Texts
username@cloudshell:~/Texts$ ls
file.txt  README-cloudshell.txt

و الآن حان الوقت لتفعيل تلك الجملة الغريبة التي كتبناها في ملف file، و لفعل ذلك سنحتاج لتغيير إسم الملف، و هنا نذكر خاصية أخرى للأمر mv، وهو أنه ينقل الملفات كما أن بإمكانه تعديل الأسماء.

username@cloudshell:~/Texts$ mv file.txt script.sh

حسنا لقد غيرنا إسم الملف ( و نوعه كذلك لأننا غيرنا ما بعد النقطة )، و أصبح الآن عبارة عن سكريبت للصَّدفة - Shell Script -، السكريبت هو ملف به مجموعة من التعليمات نقدمه للصدفة لتنفيذه، في حالتنا كتبنا تعليمة واحدة حتى نُبسط الأمور، لكن أتعلم ماذا حدث حقا؟ أدخل الأمر ls:

username@cloudshell:~/Texts$ ls
README-cloudshell.txt  script.sh

الملف النصي لم يعد موجودا، و هذا منطقي لأنه في الحقيقة هو لم يختفي لكن تغير إسمه، لذلك تذكر أنَّ الأمر mv يعدل على الملف الأصلي لذا لو أردت مثلا أن تحافظ على الملف الأصلي و تنشئ آخر جديدا بإسم مغاير فيلزمك إستعمال الأمر cp:

username@cloudshell:~/Texts$ cp script.sh file.txt

و الآن لدينا ملفين منفصلين ملف نصي، و سكريبت.

لا فائدة من سكريبت لا يعمل أليس كذلك؟ لنجرب تشغيله، لتشغيل سكريبت - أو برنامج - نكتب مساره:

./script_name.sh أو ./program_name

هناك فرق طفيف بين السكريبت و البرنامج لكن لا حاجة لأن نتعمق في الموضوع.

. : النقطة تعني المجلد الحالي

/ : كما لو أنها تعني ' في '

script_name:إسم السكريبت

رغم أن طريقة التشغيل هذه تبدو غريبة بعض الشيء إلا أنها الطريقة الوحيدة، و فكر فيها كما لو أنك تقول ' شغِّل لي السكريبت ذو الإسم ... الموجود في الملف الحالي '.
و الآن لنجرب الأمر:

username@cloudshell:~/Texts$ ./script.sh

هل جربت؟ لابد و أنك تحصلت على خطأ، لا تقلق لقد تعمدت ذلك حتى نتطرق لموضوع جديد، الجملة التي ظهرت لك هي:

-bash: ./script.sh: Permission denied

لنركز على الجزء الأخير منها - Permission deniend - و التي تعني إذن مرفوض و هذا يوجهنا لموضوع جديد ( قد يحتاج مقالا منفصلا لشرحه بشكل أفضل ) و هو الأذونات - Permissions -.

كل شيء على لينكس لديه أذونات، و هناك ثلاث أنواع من الأذونات:

إذن القراءة: يسمح بقراءة الملف أو رؤية محتوى المجلد و يرمز له بـ ' r ' أي read.

إذن الكتابة: يسمح بالتعديل على الملف أو المجلد و يرمز له بـ ' w ' أي write.

إذن التشغيل: يسمح بتشغيل الملف ( إذا كان قابلا للتشغيل، و في حال المجلد فهو يسمح لنا بالإنتقال إليه ) و يرمز له بـ ' x ' أي execute.

و لنرى أذونات الملفات و المجلدات نحتاج للأمر ls مضاف له خيار معين:

username@cloudshell:~/Texts$ ls -l
total 12
-rw-r--r-- 1 username username  23 Oct 30 14:33 file.txt
-rw-r--r-- 1 username username 913 Nov  1 07:37 README-cloudshell.txt
-rw-r--r-- 1 username username  23 Nov  1 08:25 script.sh

لربما تكون مندهشا بعض الشيء، لا تقلق لا حاجة أن تفهم كل هذا ( فكما قلت هذا يحتاج مقالا آخر )، لكن كل ما يهمنا هو ما هو مكتوب في بداية كل سطر ( من اليسار )، يبدو أنك قد تعرفت على بعض الأمور أليس كذلك؟ تلك هي الأذونات الخاصة بكل ملف، و منها ماهو مكرر لأنها تحدد الأذونات للمستخدم الحالي و المستخدمين الآخرين، فالمستخدم الحالي لديه إذنين، القراءة و الكتابة أما الآخرين لديهم إذن القراءة فقط.

الإذن الحالي الذي نحتاجه هو إذن التشغيل للمستخدم الحالي و لإضافة هذا الإذن نستخدم الأمر chmod - تغيير الأسلوب Change Mode - ( الأذونات عادة ما يُرمز لها بالأسلوب ):

username@cloudshell:~/Texts$ chmod u+x script.sh

u: تعني المستخدم - user - الحالي

x+: تعني أضف إذن التشغيل - execute -

و الآن لنرى الأذونات الجديدة:

username@cloudshell:~/Texts$ ls -l
total 12
-rw-r--r-- 1 username username  23 Oct 30 14:33 file.txt
-rw-r--r-- 1 username username 913 Nov  1 07:37 README-cloudshell.txt
-rwxr--r-- 1 username username  23 Nov  1 08:25 script.sh
 

كما ترى لون - إسم - الملف تغير كما تم إضافة x مع البداية ما يعني أن المستخدم الحالي يملك إذن التشغيل، إذا لنشغل الملف:

username@cloudshell:~/Texts$ ./script.sh
Hello, Terminal


كما ترى السكريبت يعمل و تمت طباعة الجملة، فنحن كتبنا من قبل:

echo 'Hello, Terminal'

و الأمر echo يقوم بطبع ما يأتي بعده ( لا يطبع الرمز ' لأن هذا الرمز يستخدم للدلالة على أن ما بعده هو مجرد نص كما نضيفه في الأخير لنحدد أين ينتهي النص ).
يمكنك تجربة الأمر echo و طباعة ما تريد مثلا:

username@cloudshell:~/Texts$ echo "It's Shaheen!"
It's Shaheen!

قد ترى أني بدل الرمز ' إستخدمت الرمز " و ذلك لأني إحتجت الرمز الأول في النص، و لو قمت بتحديد النص بالرمز الأول لحصل خطأ، فالصَّدفة ستعتقد أن النص ينتهي عند It، و أن ما بعده هو أمر آخر، المهم كلا من الرمز ' و " يقومان بنفس الوظيفة وهي تحديد بداية و نهاية النص و أنت إستخدم ما تجده مساعدا لوضعك.

حسنا لقد شرحنا الكثير من المفاهيم و أتمنى أنكم إستمتعتم بالجولة لكن يلزمنا تنظيف الفوضى التي أحدثناها ( في الحقيقة الأمر ليس ضروري لكن للغرض التعليمي سنقوم بذلك ).

لذلك سنحذف المجلد Texts ( لو أردت الإحتفاظ به إعمل نسخة منه عن طريق الأمر cp -r مثلما قمنا قبل قليل مع السكريبت و الملف النصي لا تقلق بشأن r- سأشرحها بعد قليل ).

على كل حال نحن حاليا في المجلد Texts أولا سنحذف ملف فقط ( حتى نرى كيفية حذف الملفات ) و هو الملف النصي الذي وجدناه أولا و للقيام بذلك نحتاج للأمر rm:

username@cloudshell:~/Texts$ rm README-cloudshell.txt

و الآن لنحذف كل المجلد، لكن كما تعلم نحن حاليا في المجلد الذي نريد حذفه لذلك سيتوجب علينا الرجوع للمجلد الأب - السابق - و من هناك نحذفه أتتذكر كيفية الرجوع للمجلد الأب؟ هي هكذا:

username@cloudshell:~/Texts$ cd ..

و الآن لنحذف المجلد:

username@cloudshell:~$ rm Texts


مشكل آخر أليس كذلك؟:

rm: cannot remove 'Texts': Is a directory

الأمر rm لا يحذف المجلدات، لكن لدينا أمر rmdir أليس كذلك؟ لنجرب الأمر:

username@cloudshell:~$ rmdir Texts

مشكل؟ هل نسيت؟ الأمر rmdir يحذف المجلدات الفارغة فقط:

rmdir: failed to remove 'Texts': Directory not empty

ما العمل إذا؟ لا تقلق الحل في الأمر rm لكن سنُمده ببعض القوة عن طريق إضافة خيار r-:

username@cloudshell:~$ rm -r Texts

الآن تم حذف المجلد بنجاح، الخيار r- نضيفه للأمور إذا كنا نريد منها التعامل مع مجلد ما مثل cp أو rm ( الأمر mv غير معني ).
إلى هنا تكون قد إنتهت جولتنا في طرفية لينكس، أتمنى أنكم إستمتعم و إستفدتم.
لمن يريد التعمق أكثر في الطرفية و سطر الأوامر أنصح بكتاب سطر أوامر لينكس ترجمة عبد اللطيف محمد أديب ايمش، رابط تحميل الكتاب: سطر أوامر لينكس

الكيبورد من تصميم: Bamicon

كلمات دليلية: gnu/linux linux open-source
1
إعجاب
1425
مشاهدات
0
مشاركة
1
متابع

التعليقات (0)

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !