1) ما هو أمر which ولماذا نستخدمه؟
أمر which يعرض المسار الكامل للبرنامج التنفيذي (executable) الذي سيتم تشغيله عندما تكتب اسم الأمر في التيرمنال.
يعتمد على متغير البيئة PATH:
PATHهو قائمة مجلدات يبحث فيها النظام عن الأوامر (مثل/usr/bin,/bin…).
مثال:
إذا كتبت:
lsBashفالنظام يبحث عن ls داخل مجلدات PATH ويشغّل أول واحد يجده.
2) الصيغة العامة (Syntax)
which COMMANDBashمثال:
which lsBash3) أمثلة أساسية
أ) معرفة مسار أمر نظامي
which lsBashقد يعطي:
/usr/bin/lsBashب) أوامر أخرى
which python
which git
which nanoBash4) فهم سريع لـ PATH (مهم للمبتدئ)
اعرض قيمة PATH:
echo $PATHBashسترى شيئًا مثل:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binBashالنظام يبحث بالترتيب من اليسار لليمين.
يعني لو فيه نفس الأمر موجود في مكانين، سيختار أول مسار يظهر في PATH.
5) مثال عملي: لماذا which لا يجد سكربت في مجلدك؟
أنشئ سكربت:
cd ~/project
printf '#!/bin/bash\necho "Hello, World!"\n' > hello.sh
chmod +x hello.shBashجرّب تشغيله:
./hello.shBashالآن جرّب:
which hello.shBashغالبًا لن يظهر شيء ❗
لأن ~/project عادةً ليس ضمن PATH.
كيف أجعله يظهر؟
إما:
- تشغله بالمسار:
which ./hello.shBash(في بعض الأنظمة قد لا يعتبره “أمر في PATH”)
أو 2) تضيف مجلدك إلى PATH (مفهوم تعليمي فقط):
export PATH="$HOME/project:$PATH"
which hello.shBashإضافة PATH بشكل دائم تتم عادةً في
~/.bashrcأو~/.zshrc(حسب shell).
6) خيار مهم جدًا: عرض كل النسخ الموجودة للأمر -a
إذا عندك أكثر من نسخة من Python مثلًا:
which pythonBashيعرض “الأول” فقط.
لعرض كل ما هو موجود في PATH:
which -a pythonBashهذا يفيد في:
- معرفة هل عندك أكثر من نسخة
- حل مشاكل “ليش python يشغّل نسخة مختلفة؟”
7) كيف أعرف إذا الأمر موجود أصلاً؟ (Exit Code)
جرّب أمر غير موجود:
which something_that_does_not_exist
echo $?Bashإذا ظهر:
1Bashيعني الأمر غير موجود في PATH.
إذا ظهر:
0Bashيعني موجود.
8) فرق مهم: which vs type vs command -v
هذه نقطة قوية للمبتدئين لأن which أحيانًا لا يكشف “الأوامر الداخلية” أو “aliases” حسب النظام.
أ) type (ممتاز لمعرفة alias/function/builtin)
type ls
type cdBashقد يعطي مثلًا:
ls is aliased to ...cd is a shell builtin
ب) command -v (الأكثر اعتمادية في السكربتات)
command -v python
command -v lsBashكثير خبراء لينكس يفضلون
command -vبدلwhichداخل السكربتات لأنه سلوكُه أوضح وأكثر قابلية للنقل.
الخلاصة العملية:
- للتعلم السريع:
which - لمعرفة نوع الأمر (alias/builtin):
type - للسكربتات والتحقق:
command -v
9) أمثلة عملية شائعة جدًا
أ) لماذا تشغيل python يختلف؟
which -a python
python --versionBashب) تأكد من مكان git قبل تشغيل سكربت نشر
which gitBashج) تحقق إن برنامج موجود قبل استخدامه
command -v docker >/dev/null && echo "docker exists" || echo "docker not found"Bash10) تدريب سريع (Practice)
نفّذ هذا:
# 1) مسارات أوامر معروفة
which ls
which -a python
# 2) اعرف نوع الأمر
type cd
type ls
# 3) سكربت محلي (لن يظهر في which غالبًا)
cd ~/project
printf '#!/bin/bash\necho OK\n' > demo.sh
chmod +x demo.sh
which demo.sh
./demo.sh
# 4) تحقق من وجود أمر
which not_a_command
echo $?Bashهل الشرح الأصلي كافي؟
نعم ممتاز كبداية، والإضافات المهمة للمبتدئ كانت:
- شرح
PATHولماذاwhich hello.shغالبًا لا يجد سكربت في مجلدك - استخدام
which -aلتعدد النسخ - الفرق بين
whichوtypeوcommand -v(مهم جدًا لحل مشاكل الـ alias والـ builtin)