شرح ما هو متغير البيئة و PATH و alias

بسم الله الرحمن الرحيم
السلام عليكم وحرمة الله وبركاته


ما هي متغيرات البيئة متغيرات البيئة لتبسيط الأمر أكثر يمكن تشبيهها مثلا  كوعاء وقيمة المتغير مثلا هي المياه داخل الوعاء أي هي شيء يخزن قيمة:





ماهي هذه القيمة ولماذا تستخدم غالبا هي معلومات عن النظام مثلا إسم المستخدم الذي دخلنا منه مسار مجلد المنزل خاص بالمستخدم الذي دخلنا منه وقد تتضمن محرر نصوص إفتراضي والكثير ... لماذا تستخدم هذه القيم تستخدم بكل بساطة لكل شيء يحتاج أن يحصل على هذه القيم مثلا أنا أبرمج برنامج أريده أن أعرف لغة النظام و... بعض الأمثلة إكتبو في الطرفية 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 وهو المستخدم غالبا كما قلت في الأعلى على العموم لنكمل نفتح الطرفية ونكتب مثلا كما في اﻷاسفل .

export myname=yucef
ثم دون أن نغلق الطرفية Terminal نكتب env أو set او نطبع قيمة المتغير كما في الألسفل لنلاحظ أن تمت إضافة المتغير .
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. لأن التغيرات ستحذف عند غلق الطرفية على العموم لنكمل نفح طرفية ونكتب كما في اﻷاسفل .

export PATH=~/bin
سنحصل على مشاكل في الطرفية لأننا حذفنا كل مسارات PATH وفقط وضعنا مجلد bin علامة = تقوم بتعين  قيمة ولا تضيف نلاحظ اننا خسرنا كل المسارات الأخر مثل bin/ و usr/bin/ و ...وهذا أمر خطير جدا لكن لا مشكلة نغلق الطرفية يعود كل شيء كما كان .

الأن الطريقة الصحيحة لإضافة مجلد إلى متغير PATH  يجب أن نضيف مسار المجلد + المسارات الموجودة مسبقا وإذا لاحظنا  في أول الموضوع عند عرض محتوى متغير PATH تجد أن المسارات يتم الفصل بينها بنقطتين : لهذا نكتب كما في الأسفل .
export PATH=$PATH:~/bin
ليفهم الموضوع قومو بكتابة
echo ~/bin
echo $PATH:~/bin
فإذا قيمة PATH اصبحت كالناتج في أخر أمر  في الأعلى echo أمر للطباعة فقط ليس له أي دور أخر هنا .
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
طبعا هذا مثال للتوضيح فقط وممكن حل موضوع android studio بأكثر من طريقة.

أو الأفضل إنشاء ملف ينتهي إسمه ب 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

شارك الموضوع

مواضيع ذات صلة

التسميات

2016 (1) 23 (1) 24 (3) 25 (1) 26 (1) 27 (1) 28 (1) 29 (1) 30 (1) 31 (1) إتصال (1) إختراق (2) أدة (1) أدوات (1) إرسال (1) أرش (1) إسترجاع (1) إستعلام (1) أشياء (7) أشياء تفعلها (8) إصدارات (1) إصلاح (6) إصلاحrealtek (1) إضافات (1) إضافة (1) أعجوبة (1) أعجوية (1) إعداد (1) إقاف (2) أقسام (1) ألعاب (2) الفرق (1) الفلاشة (1) القسم هوم (1) الكتابة بالعربية (1) إلى جانب (1) أندرويد (1) إنشاء (1) إنشاء مستودع (1) أيات (1) أيزو (1) أيقومات (1) أيقونات (1) ايقونات (2) باتش (1) بارامتر (1) بايثون (16) برامج (56) برامج إسلامية (2) برنامج (19) برودباند (1) بعد (7) بعد التثبيت (8) بلوتوث (1) بناء (1) بناء توزيعة (1) بيئة عمل (1) تثبيت (29) تجهيز (2) تجهيو من دون (2) تحزيم (2) تحقق (1) تحويل (1) تخصيص (5) ترجمة (2) ترقية (1) تسجيل الشاشة (1) تشغيل (3) تعريف (13) تعطيل (2) تعلم (6) تفعلها (7) تفعيل (2) تقطع الأحرف (1) تقعيل (1) تنزيل (2) تورنت (1) توزيعة (1) توسعة (1) ثيم (5) ثيمات (1) جافا (1) جماليات (7) جنوم (1) حجم (1) حرق (2) حزمة (1) حل (2) دالة (1) دورة (1) روتر (1) ريدهات (2) سكربت (2) شرح (11) صورة متحركة (1) فايرفوكس (1) فتح منفذ (1) فصل (1) فلاشة (3) فيدورا (29) فيدورا بالعربي (1) قاموس (1) كالي (2) كتاب (2) كتب (2) كرت (1) كروت الشاشة (1) كلمة المرور (2) كورس (1) كورورا (1) لعبة (1) لينكس (2) لينكسو (1) ماهو (6) متغير البيئة (1) مجانا (1) محاكات (2) محاكي (1) محمل الإقلاع إصلاح (1) محمول (1) مستودعات (1) مشكلة (2) ملف نصي (1) من إصدار (1) نظام ملفات (1) نمط (2) نواة (1) هجين (4) واجهات (1) وايرلس (1) وهمي (2) ويندوز (2) access token (1) active (2) add (1) after (7) alias (1) andoid studio (1) android (2) android studio (1) Apache (2) appstream (1) arboot (1) arboot fix (1) arch (3) archiso (1) arfedoraccframework (3) arfedoracontrolcenter (3) arfedy (1) atari (1) atom (1) ayat (1) bicon (1) blivet (1) blivet-gui (1) bls (1) bluetooth (1) book (2) books (2) bootloader fix (1) boxes (3) broadband (1) broadcom (1) broadwayd (1) bugzilla (1) build (2) builddep (1) bumblebee (1) bumbleebe (2) burn (2) byzanz (1) c# (1) calamares (1) camera (1) cannot open display (1) cannot open display: :0 (1) ccna (1) cd (2) centos (1) change (2) chsh (1) cisco (1) clion (1) clone (1) code.org (1) command (2) command line (2) commands (2) comps (1) connect (1) contra (1) convert (1) copr (1) could not connect to the debugger (1) cpu (1) cpufreq (1) createrepo (1) csharp (1) css (1) curlew (1) custom (2) dbus (3) dconf (1) dd (1) Decryption (1) defragment (2) desktop (1) desktop entry (1) dictionary (1) Digital signature (1) disks (1) dnf (14) do (7) docker (1) dolphine (1) download (2) downloads manager (1) dply (1) DRI PRIME (1) driver (9) dukto (1) e2fsck (1) efi (4) el forkane (1) elforkane (1) elif (1) emergency (3) emergency mode (3) emulator (1) enable (2) Encryption (1) entries (1) error mounting /dev/sd (1) ext4 (1) extend (1) extensions (2) fakenes (1) fast startup (2) fceux (1) fedora (45) fedora 25 alpha (1) fedora cloude (1) fedora28 (1) fedoraوفيدورا (1) fedy (1) fgmac (2) fgmac-24 (1) file (1) find (1) firefox (2) fix (10) flash mem (1) flash memory (2) flashplayer (1) flatpak (4) forward (1) fpaste (1) free (1) freebsd (1) freevpn (1) function (1) game (3) games (2) gedit (1) genymotion (1) gettext (1) gif (1) gimp (1) gio (1) github (5) github.io (1) glibc-common (1) gmaclinux (2) gnome (16) gnome boxes (1) gnome disk (1) gnome shell (13) gnome terminal (1) gnome-disks (1) gnu (1) godot (1) goldendict (1) google web designer (1) gpg (2) gradio (1) group (2) grub (7) grub2 (1) grubenv (1) gstreamer (1) gtk (8) gtk+ (1) gvrecord (1) hack (2) hash (4) hdmi (3) hibernate (1) home (2) hosspot (1) html (1) http (1) hybrid (2) icon (2) icons (3) ide (1) if (1) install (32) installf (9) installing (7) intellij idea (1) internet downlaod manager (1) iso (2) java (3) jdk (2) jetbrains (1) jetbrains toolbox (1) kali (2) kde (3) kernel (1) kernel parameters (1) key (1) kickstarts (3) korora (1) krita (1) kvm (2) kvm switches (1) lamp (1) laps (1) learn (1) legacy (1) legacy bios (3) libreoffice (2) libvirt (1) life is trange (1) linux (8) lutris (1) lv (1) lvm (2) mac (4) macros (1) mageia (1) make distro (1) mariadb (1) MariaDB and PHP Lamp Server (1) markdown (2) mate terminal (1) mbr (1) md5sum (1) mirro (1) mkconfig (1) mo (1) mono (2) monodevelop (2) mount (1) mp4 (1) multi screen (1) mumble (1) murmur (1) natron (1) nautilus (2) nes (1) netbeans (1) netcut (1) nintendo (1) ntfs (2) nvidia (8) objdesktop (1) ojuba (2) oop (1) opensuse (1) openvpn (1) opera (1) optirun (2) oracle (1) os.path (1) package (2) page (1) pages (1) pantheon (1) parameter (1) parameters (1) password (2) patch (1) path (2) pdf (1) peek (1) photoshop (1) php (1) phpstorm (1) plasma (2) plugin (3) plugins (1) plymouth (1) po (1) polkit (1) port (1) portable (1) portmatp (1) PostinstallerF (1) pot (1) powerline (2) powerline-go (1) preset (1) preview (1) primary display (1) primeos (1) primus (1) primusrun (1) private key (1) programs (3) protonvpn (1) pubg (1) public key (1) put (1) pv (1) pycharm (2) pygobject (4) pygtk (5) python (56) pythonk (1) qdbus (1) qemu (3) qemu-kvm (1) query (1) radio (1) raspberry pi (4) raspbian (2) reclaim space (2) record (1) redhat (3) remix (1) remix os (1) repo (4) repofrompath (1) repository (1) reset (1) resize2fs (1) rhel (1) router (1) rpm (7) rpmbuild (1) rtl8188ee (1) rtl8192c (1) rtl8192ce (1) rtl8192cu (1) rtl8192de (1) rtl8192ee (1) rtl8192se (1) rtl8723ae (1) rtl8723be (1) rtl8723com (1) rtl8821ae (1) rubymine (1) salix (1) scratch (2) scratch2.scratch 2 (1) screencast (1) script (2) seconday display (1) self (1) send (1) server (1) settings (2) sha1256sym (1) sha256sum (1) share desktop (1) shell (2) shortcut (1) shutter (1) skel (1) skel ماهو (1) skype (1) skype.برامج (1) slackware (1) software (1) soundcloud (1) source code (1) spec (2) spin (1) sqlmap (1) ssh (3) sshd (2) st-trans (1) steam (2) store (1) su (1) sudo (2) sudoers (1) swap (2) switch (2) Switchable Graphics (1) synergy (1) systemd (1) systemd preset (1) teamviewer (1) terminal (2) theme (5) things (7) thomson (1) thread (2) threading (2) thumbnails (1) to (8) tor (2) tor browser (1) torrent (1) transfer closed with 736700 bytes remaining to read (1) translation (1) turn off (2) tuxcut (1) txt (1) ubuntu (1) uefi (5) unable to mount location (1) unity (1) unity3d (1) upgrade (1) usb (1) useradd (2) utf-8 (1) vega (1) verify (1) vg (1) vgaوتبديل (1) vi (1) video (1) vim (1) vino (1) virsh (1) virt-install (1) virt-manger (1) virtual (1) virtual box (1) virtualbox (3) vmware (3) vnc server (1) vokoscreen (1) vpn (1) web server (1) webstorm (1) wifi (1) windows (4) windows-1256 (1) wine (1) woeusb (1) X Error: BadAccess (1) X Error: BadDrawable (1) xdg-mime (1) xdman (1) xfce (1) xfconf-query (1) yum (2) zeal (1) zealdocs (1)