Which Command

1) ما هو أمر which ولماذا نستخدمه؟

أمر which يعرض المسار الكامل للبرنامج التنفيذي (executable) الذي سيتم تشغيله عندما تكتب اسم الأمر في التيرمنال.

يعتمد على متغير البيئة PATH:

  • PATH هو قائمة مجلدات يبحث فيها النظام عن الأوامر (مثل /usr/bin, /bin…).

مثال:
إذا كتبت:

ls
Bash

فالنظام يبحث عن ls داخل مجلدات PATH ويشغّل أول واحد يجده.

2) الصيغة العامة (Syntax)
which COMMAND
Bash

مثال:

which ls
Bash
3) أمثلة أساسية
أ) معرفة مسار أمر نظامي
which ls
Bash

قد يعطي:

/usr/bin/ls
Bash
ب) أوامر أخرى
which python
which git
which nano
Bash
4) فهم سريع لـ PATH (مهم للمبتدئ)

اعرض قيمة PATH:

echo $PATH
Bash

سترى شيئًا مثل:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Bash

النظام يبحث بالترتيب من اليسار لليمين.
يعني لو فيه نفس الأمر موجود في مكانين، سيختار أول مسار يظهر في PATH.

5) مثال عملي: لماذا which لا يجد سكربت في مجلدك؟

أنشئ سكربت:

cd ~/project
printf '#!/bin/bash\necho "Hello, World!"\n' > hello.sh
chmod +x hello.sh
Bash

جرّب تشغيله:

./hello.sh
Bash

الآن جرّب:

which hello.sh
Bash

غالبًا لن يظهر شيء
لأن ~/project عادةً ليس ضمن PATH.

كيف أجعله يظهر؟

إما:

  1. تشغله بالمسار:
which ./hello.sh
Bash

(في بعض الأنظمة قد لا يعتبره “أمر في PATH”)

أو 2) تضيف مجلدك إلى PATH (مفهوم تعليمي فقط):

export PATH="$HOME/project:$PATH"
which hello.sh
Bash

إضافة PATH بشكل دائم تتم عادةً في ~/.bashrc أو ~/.zshrc (حسب shell).

6) خيار مهم جدًا: عرض كل النسخ الموجودة للأمر -a

إذا عندك أكثر من نسخة من Python مثلًا:

which python
Bash

يعرض “الأول” فقط.

لعرض كل ما هو موجود في PATH:

which -a python
Bash

هذا يفيد في:

  • معرفة هل عندك أكثر من نسخة
  • حل مشاكل “ليش python يشغّل نسخة مختلفة؟”
7) كيف أعرف إذا الأمر موجود أصلاً؟ (Exit Code)

جرّب أمر غير موجود:

which something_that_does_not_exist
echo $?
Bash

إذا ظهر:

1
Bash

يعني الأمر غير موجود في PATH.

إذا ظهر:

0
Bash

يعني موجود.

8) فرق مهم: which vs type vs command -v

هذه نقطة قوية للمبتدئين لأن which أحيانًا لا يكشف “الأوامر الداخلية” أو “aliases” حسب النظام.

أ) type (ممتاز لمعرفة alias/function/builtin)
type ls
type cd
Bash

قد يعطي مثلًا:

  • ls is aliased to ...
  • cd is a shell builtin
ب) command -v (الأكثر اعتمادية في السكربتات)
command -v python
command -v ls
Bash

كثير خبراء لينكس يفضلون command -v بدل which داخل السكربتات لأنه سلوكُه أوضح وأكثر قابلية للنقل.

الخلاصة العملية:

  • للتعلم السريع: which
  • لمعرفة نوع الأمر (alias/builtin): type
  • للسكربتات والتحقق: command -v
9) أمثلة عملية شائعة جدًا
أ) لماذا تشغيل python يختلف؟
which -a python
python --version
Bash
ب) تأكد من مكان git قبل تشغيل سكربت نشر
which git
Bash
ج) تحقق إن برنامج موجود قبل استخدامه
command -v docker >/dev/null && echo "docker exists" || echo "docker not found"
Bash
10) تدريب سريع (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)