پیدا کردن مسیر دستورها در یونیکس ها

زمانی که در یک سیستم عامل یونیکسی و حتی ویندوزی دستوری را از خط فرمان اجرا می کنید، سیستم عامل مسیرهای درون متغیر محیطی PATH را بررسی می کند که آیا مسیری برای پیدا کردن دستور در میان مسیرهای متغیر PATH وجود داشته باشد. اما با استفاده از دستورهایی می توانید مسیر یک دستور را پیدا کنید.

در یونیکس ها چند دایرکتوری زیر به صورت پیشفرض فایل های دودویی (فایل های اجرایی) دستورها را نگه می دارند. این دایرکتوری ها عبارتند از:

  • bin/
  • usr/bin/
  • sbin/
  • usr/sbin/

ساختار سلسله مراتبی دایرکتوری ها در لینوکس

ممکن است مسیر منتهی به برخی از دستورهایی که کاربران غیر root هم می توانند آنرا اجرا کنند در محتوای متغیر PATH وجود نداشته باشد، بنابراین کاربر با اجرای دستور خطای Command not found را می بیند. به طور مثال در توزیع هایی مانند CentOS 7 و openSUSE 42.1 متغیر PATH کاربران عادی فاقد مسیر sbin/ است، بنابراین حتی با اینکه یک کاربر عادی می تواند دستور ifconfig را اجرا کند، ولی با اجرای دستور ifconfig خطای زیر نشان داده می شود.

Absolute path to 'ifconfig' is '/sbin/ifconfig', so running it may require superuser privileges

بنابراین باید از مسیر مطلق (Absolute Path) به صورت زیر استفاده کنید.

sbin/ifconfig/

دستور which

از دستور which همراه با نام دستور برای پیدا کردن مسیر (محل ذخیره سازی) دستور استفاده می شود.

which ifconfig

اگر سیستم عامل در بین مسیرهای درون متغیر PATH نتواند مسیر دستور را پیدا کند خطای شکل زیر نشان داده می شود.

linux_find_cmd_path1

دستور whereis

برای پیدا کردن مسیر منتهی به یک دستور از دستور whereis به صورت زیر استفاده کنید. این دستور قطعا اگر مسیر دستور نصب شده را نشان می دهد.

whereis ifconfig

ifconfig: /sbin/useradd /usr/share/man/man8/useradd.8.gz

 تفاوت میان دستورهای which و whereis

دستور whereisمحل فایل های دودویی (Binary Files یا Executable Files)، فایل های سورس (Source) و راهنماها (Manual) ها را تعیین می کند.whereis در محل های پیشفرض به دنبال فایل های باینری، سورس ها و راهنما ها می گردد، در صورتی که دستور which‌ تنها در محتوای متغیر PATH‌ به دنبال پاسخ می گردد. بنابراین ممکن است محلی (مسیری) در متغیر PATH باشد (به طور مثال دایرکتوری bin در زیر دایرکتوری خانگی) که whereis‌ در آن جستجو نمی کند.

export PATH:$PATH:$HOME/bin

دستور whereis دارای سویئچ هایی برای اعمال محدودیت در جستجو است. به طور مثال در دستور زیر با استفاده از b- تنها به دنبال فایل های دودویی می گردیم.

‘{;whereis -b ifconfig | awk ‘{ print $2

سویئچ های m- و s- به نرتیب برای جستجوی فایل های راهنما و سورس استفاده می شوند. سویئچ های B- و S- و M- به ترتیب لیستی از دایرکتوریی هایی را تعیین می کند که برای اعمال محدودیت در جستجوی فایل دودویی، فایل سورس و فایل راهنما استفاده می شود.

دستور زیر به دنبال پیدا کردن محل فایل راهنمای دستورهای ls‌ و cal‌ است که برای ls‌ در تمامی محل های پیشفرض فایل راهنما جستجو می کند ولی برای دستور cat تنها در دایرکتوری usr/share/man/man1/ جستجو می کند. f- نیز به معنی خاتمه یافتن فهرست دایرکتوری ها است و بعد از آن نامی که باید جستجو شود (در اینجا cal)‌ آورده شده است.

whereis -m ls -M /usr/share/man/man1 -f cal