بسم الله الرحمن الرحيم
السلام عليكم وحرمة الله وبركاته
ما هي متغيرات البيئة متغيرات البيئة لتبسيط الأمر أكثر يمكن تشبيهها مثلا كوعاء وقيمة المتغير مثلا هي المياه داخل الوعاء أي هي شيء يخزن قيمة:
ماهي هذه القيمة ولماذا تستخدم غالبا هي معلومات عن النظام مثلا إسم المستخدم الذي دخلنا منه مسار مجلد المنزل خاص بالمستخدم الذي دخلنا منه وقد تتضمن محرر نصوص إفتراضي والكثير ... لماذا تستخدم هذه القيم تستخدم بكل بساطة لكل شيء يحتاج أن يحصل على هذه القيم مثلا أنا أبرمج برنامج أريده أن أعرف لغة النظام و... بعض الأمثلة إكتبو في الطرفية Terminal الأوامر في اﻷسفل.
echo $USER
echo $PATH
echo $SHELL
echo $LANG
echo $HOSTTYPE
echo $GDMSESSION
echo $OSTYPE
echo $HOME
1- echo $USER يعرض إسم المستخدم الذي دخلنا منه على النظام.
2-echo $PATH يعرض كل المجلدات التي يتم البحث بداخلها عن البرامج مثلا عندما تكتب أنت في الطرفية firefox كيف يعلم النظام أين موجود هذا الملف ليشغله سيبحث في المجلدات التي تم وضع قيمتها في متغير PATH غالبا bin/ و usr/bin/ و..ليس فقط البرامج مثلا أمر cp وهو بالنهاية عبارة عن برنامج ستجدوه في هذه المجلدات وممكن أن تضيف لك مجلد خاص ....غالبا ستحتوي هذه المجلدات ملفات التنفيذ أو إختصار لها shortcut والمكتبات شيء كملفات ال DLL في ويندوز بالمناسبة في ويندوز أيضا ذات الشيء يوجد متغير PATH .
3-echo $SHELL يعرض أي shell مستخدم هناك أكثر من shell في انظمة جنو لينكس لكن غالبا سيكون bash ملاحظة ممكن تغير ال shell لكن ليس موضوعنا ببساطة إذا قمنا بتغير ال shell ذات الهدف لكن قد تختلف بعض الأوامر والمميزات وتختلف طريقة كتابة السكربت .
4-echo $LANG يعرض لغة النظام.
5-echo $HOSTTYPE يعرض هل النظام 64bit او 32bit او شيء اخر.
6-echo $GDMSESSION يعرض أي واجهة تم الدخول منها في واجهة الدخول GDM وضعت هذا المثل لأقول أن هناك متغيرات أساسية تكون في كل التوزيعات والواجهات وهناك متغيرات تتم إضافتها من قبل المستخدم او القائمين على التوزيعة أو مثلا أي برنامج أو واجهة و...يعني بعض اﻷمثلة في الأعلى قد لا تجدها عندك سيعطي سطر فارغ لا قيمة بداخله مثال عندي متغير خاص ب QT الذي لا أعلم شيء عنه QT_GRAPHICSSYSTEM_CHECKED=1 مكتبة QT شيء خاص بالوجهات الرسومية وأكثر أقصد أن مجالها واسع ومتفرع.
7-echo $OSTYPE يعرض لك نوع النظام مثلا في فيدورا سيطبع لك linux-gnu .
8-echo $HOME كما قلت في موضوع أخر يعرض لك مسار مجلد المنزل للمستخدم .
إلى جانب المتغيرات هناك أيضا دوال مهمتها أن تقوم ببعض الاشياء وترجع لنا قيمة أو تقوم بعمل معين الدالة حتى تفهم أكثر هي شيء كأداة تقوم بشيء معين وهي عبارة عن مجموعة من الأسطر من الأكواد .
كيف ممكن عرض كل هذه المتغيرات نكتب env أو set لنحصل على امور اكثر بالمناسبة env و set موجودين بمجلد محفوظ مساره في متغير PATH .
مثال عن الإستفادة من هذه المتغيرات جلب مسار مجلد المنزل للمستخدم في لغة بايثون طبعا ممكن أيضا بأي لغة خاصة bash script لكن لا أعلم الكثر عنها.
import os
a=os.getenv("HOME")
print a
الان إذا أردنا تغير قيمة متغير او نريد أن نضيف متغير نكتب في الطرفية إذا كنا نستخدم shell من نوع bash وهو المستخدم غالبا كما قلت في الأعلى على العموم لنكمل نفتح الطرفية ونكتب مثلا كما في اﻷاسفل .
ثم دون أن نغلق الطرفية Terminal نكتب env أو set او نطبع قيمة المتغير كما في الألسفل لنلاحظ أن تمت إضافة المتغير .export myname=yucef
echo $myname
الأن هناك مشكلة إذا قمت بإغلاق الطرفية Terminal سيتم حذف المتغير هناك حل للموضوع نكتب export myname=yucef داخل ملف bashrc. وهو ملف مخفي في مجلد المنزل الخاص بنا نضيف السطر إلى أخر الملف ممكن من خلال أي محرر نصوص لكن أنا هنا سأختصر اﻷمر كما في الأسفل ملاحظة إعملو نسخ لصق copy paste .
echo export myname=yucef >> ~/.bashrc
الأن لتفعيل التغيرات نعيد إقلاع الجهاز أو نكتب كما في اﻷأسفل .
source ~/.bashrc
الان ماذ يحصل دائما عندما نفتح طرفية جديدة Terminal يتم تنفيذ ما بداخل ملف bashrc. لهذا عند كل تشغيل للطرفية سيتم تنفيذ أمر export myname=yucef .
الأن إضافة مجلد إلى PATH و وضع داخله سكربت يشغل أي برنامج لنفترض firefox طبعا يجب أن يكون البرنامج موجود لدينا :
1-ننشا مجلد داخل مجلد المنزل لدينا نسميه مثلا bin إذا كان موجود نغير الإسم لا مشكلة وممكن إنشائه من الواجهة الرسموية أيضا لا فرق.
mkdir ~/bin
2-داخل المجلد الذي قمنا بإنشائه نضيف سكربت يشغل firefox نقوم بتسمية السكربت runfirefox ممكن ان نقوم بالأمر من خلال أي محرر نصوص لكن انا ساختصر الموضوع إعملو نسخ لصق .
ثم نعطي السكربت صلاحيات التنفيذ .echo -e '#!/bin/bash\nfirefox' >~/bin/runfirefox
نفتح طرفية ونكتب كما في اﻷأسفل نلاحظ أنه يقول لنا لا يوجد شيء بهذا الإسم وهنا ملاحظة عندما نريد عمل سكربت لا نسميه بتسمية محجوزة لبرنامج أخر .sudo chmod 755 ~/bin/runfirefox
runfirefox
الأن نضيف كامل مسار السكربت ونشغله أو مدخل على مساره ونشغله نلاحظ أنه سيعمل تابعو معي في اﻷأسفل .
cd ~/bin
sh runfirefox
ليعمل السكربت من أي مكان في الطرفية نضيف مجلد bin الموجود في مجلد المنزل الذي اضفناه سابقا إلى متغير PATH ملاحظة دائما في نظام جنو لينكس يجب مراعات حالة الأحرف يعني PATH ليست ك path ....نكمل نفتح طرفية أو نعدل كما قلنا سابقا على ملف bashrc. لكن الأن و يفضل أولا أن نجرب من الطرفية قبل التعديل على ملف bashrc. لأن التغيرات ستحذف عند غلق الطرفية على العموم لنكمل نفح طرفية ونكتب كما في اﻷاسفل .
سنحصل على مشاكل في الطرفية لأننا حذفنا كل مسارات PATH وفقط وضعنا مجلد bin علامة = تقوم بتعين قيمة ولا تضيف نلاحظ اننا خسرنا كل المسارات الأخر مثل bin/ و usr/bin/ و ...وهذا أمر خطير جدا لكن لا مشكلة نغلق الطرفية يعود كل شيء كما كان .export PATH=~/bin
الأن الطريقة الصحيحة لإضافة مجلد إلى متغير PATH يجب أن نضيف مسار المجلد + المسارات الموجودة مسبقا وإذا لاحظنا في أول الموضوع عند عرض محتوى متغير PATH تجد أن المسارات يتم الفصل بينها بنقطتين : لهذا نكتب كما في الأسفل .
ليفهم الموضوع قومو بكتابةexport PATH=$PATH:~/bin
echo ~/bin
فإذا قيمة PATH اصبحت كالناتج في أخر أمر في الأعلى echo أمر للطباعة فقط ليس له أي دور أخر هنا .echo $PATH:~/bin
echo $PATH
الأن كما قلنا سابقا ليتم تنفيذ هذا الامر عند كل تشغيل للطرفية Terminal نضع سطر export في ملف bashrc. ونعيد إقلاع الجهاز أو نستخدم أمر source .
اﻷن لنتأكد نبقى في ذات الطرفية أي لا نغلقها ونذهب من خلال أمر cd أينما نريد ممكن مثلا إلى مجلد etc/ نكتبrunfirefox سيعمل السكربت.
الأن أيضا ممكن أن نواجه مشكلة إذا كان هناك برنامج يحتاج متغير بيئة لكن لن نشغله من الطرفية لكن سنشغله من القائمة هنا قد نواجه مشكلة وقد واجهتني هذه المشكلة عند تثبيت برنامج android studio حيث أنه يحتاج متغير بيئة إسمه JAVA_HOME يحتوي قيمة مسار مجلد java عندما أضفت export JAVA_HOME=/almasar على ملف bashrc. البرنامج إشتغل من الطرفية لكن لم يعمل عند تشغيله من القائمة وهنا ممكن إضافة مثلا السطر في الأسفل إلى ملف etc/profile/ ملاحظة نحتاج صلاحيات الجزر root للتعديل على الملف.
export JAVA_HOME=/usr/local/java
أو الأفضل إنشاء ملف ينتهي إسمه ب sh. في مجلد etc/profile.d/ وداخل هذا الملف نكتب سطر export...ثم نعطي هذا الملف صلاحيات التنفيذ قم نعيد إقلاع الجهاز أو نستخدم امر source ساعطي مثلا طبعا أحتاج صلاحيات الجزر روت لهذا أستخدم sudo أو su ويمكن إستخدام أي محرر نصوص لكن انا لدواعي الشرح ساستخدم أمور أخرى ويجب الإنتباه أن لا نضيف ملف موجود مسبقا حتى لا يحذف الملف القديم لهذا الأفضل أن يدل إسم الملف على عمله مع إضافة إسمنا أو شيء هكذا نضمن ان لا تحذف ملفات أخرى ويجب أن ننتبه إذا تكرر إسم المتغير ستتغير قيمته كما نفعل في متغير PATH الذي يكون موجود أصلا .
echo export JAVA_HOME=/usr/local/java |sudo tee /etc/profile.d/java_yucef.sh
sudo chmod 755 /etc/profile.d/java_yucef.sh
source /etc/profile.d/java_yucef.sh
الان أصبح متغير JAVA_HOME كأي متغير يأتي إفتراضيا مع التوزيعة لنجربه ملاحظة لا ننسى حالة الأحرف.
echo $JAVA_HOME
ممكن أيضا أن نضيف محتوى متغير JAVA_HOME إلى متغير PATH من خلال هذا السطر export PATH=$PATH:$JAVA_HOME.
سأضيفه إلى ذات الملف ليصبح يحتوي على سطرين
echo export PATH=$PATH:$JAVA_HOME |sudo tee -a /etc/profile.d/java_yucef.sh
الأن نطبع قيمة الإثنينsource /etc/profile.d/java_yucef.sh
echo $PATH
echo $JAVA_HOME
الأن إذا واجهتنا أي مشكلة نحذف الملفات التي أضفناها ونعيد إقلاع الجهاز أو نحذف السطر المضاف في ملف bashrc. ونستخدم أمر source لتفعيل التغيرات أو نعيد إقلاع الجهاز
الأن شرح alias الأمر ببساطة عبارة عن إضافة إختصار لامر ما وهي ذات الشيء بالنسبة للمتغيرات ليظل يعمل يجب أن نضيفه إلى ملف bashrc. ثم نعيد إقلاع الجهاز أو نستخدم أمر source وممكن أيضا إضافة ملف إلى مجلد etc/profile.d/ ونعطيه صلاحيات التنفيذ و....مثلا أمر تحديث قائمة grub في فيدورا طويل ممكن عمل إختصار له من خلال إضافة هذا السطر إلى ملف bashrc. أو أي طريقة ذكرتها سابقا ولا ننسى تفعيل التغيرات من خلال أمر source او نعيد إقلاع الجهاز ملاحظة مهمة ننتبه لا نضيف إختصار بإسم محجوز لبرنامج أخر .
alias update-grub2="sudo grub2-mkconfig -o /etc/grub2.cfg"
طبعا هناك أكثر من طريقة لكن انا أشرح alias....
ممكن مثلا مثل الموجود في أوبونتو ممكن عمل سكربت نقوم بتسميته grub-update و نضع فيه سطر grub2-mkconfig -o /etc/grub2.cfg ثم نعطيه صلاحيات التنفيذ ثم نضعه بأي مجلد موجود مساره في متغير PATH مثلا usr/bin/ .
هذا كل ما لدي لمزيد من المعلومات الأفضل قراءة كتاب سطر أوامر جنو لينكس المترجم تجدونه في هذا الموضوع رابط link