مسیر لینوکس نحوه تعیین مسیرهای پوشه. متغیر محیطی PATH. اضافه کردن متغیرهای محیط کاربر و سیستم در لینوکس

وقتی دستور را وارد می کنید خط فرمان، شما اساساً به پوسته می گویید که یک فایل اجرایی با نام مشخص را اجرا کند. در لینوکس اینها برنامه های اجراییمانند ls، find، file و دیگران تمایل دارند در چندین فهرست مختلف در سیستم شما زندگی کنند. هر فایلی با مجوزهای اجرایی ذخیره شده در این دایرکتوری ها می تواند از هر جایی اجرا شود. رایج ترین دایرکتوری هایی که حاوی برنامه های اجرایی هستند عبارتند از /bin، /sbin، /usr/sbin، /usr/local/bin و /usr/local/sbin.

اما پوسته چگونه می‌داند کدام دایرکتوری‌ها را برای برنامه‌های اجرایی جستجو کند یا پوسته در سراسر آن جستجو می‌کند سیستم فایل?

پاسخ ساده است. هنگامی که فرمانی را صادر می کنید، پوسته تمام دایرکتوری های مشخص شده در متغیر $PATH کاربر را برای یک فایل اجرایی با آن نام جستجو می کند.

این مقاله به شما نشان می دهد که چگونه دایرکتوری ها را به متغیر $PATH سیستم خود اضافه کنید.

$PATH در لینوکس چیست؟

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

برای بررسی اینکه کدام دایرکتوری ها را در متغیر $PATH خود دارید، می توانید از دستور printenv یا echo استفاده کنید:

پژواک $PATH

خروجی چیزی شبیه به این خواهد بود:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

اگر دو فایل اجرایی با یک نام دارید که در دو دایرکتوری مختلف قرار دارند، پوسته فایلی را که در دایرکتوری قرار دارد که در $PATH اول قرار دارد اجرا می کند.

افزودن دایرکتوری به $PATH شما

شرایطی وجود دارد که ممکن است بخواهید دایرکتوری های دیگری را به متغیر $PATH خود اضافه کنید. به عنوان مثال، برخی از برنامه ها ممکن است در مکان های مختلف نصب شده باشند، یا ممکن است بخواهید یک دایرکتوری اختصاصی برای ورودی های شخصی خود داشته باشید اما بتوانید آنها را بدون تعیین مسیر مطلق فایل های اجرایی اجرا کنید. برای انجام این کار، فقط باید دایرکتوری را به $PATH خود اضافه کنید.

فرض کنید یک دایرکتوری به نام bin در دایرکتوری اصلی خود دارید که اسکریپت های پوسته خود را در آن ذخیره می کنید. برای افزودن دایرکتوری به متغیر $PATH:

فرمان صادرات متغیر اصلاح شده را به محیط های فرزند فرآیندهای پوسته صادر می کند.

اکنون می توانید اسکریپت های خود را به سادگی با تایپ نام اسکریپت اجرایی بدون تعیین مسیر کامل فایل اجرایی اجرا کنید.

با این حال، این تغییر موقتی است و فقط بر جلسه پوسته فعلی تأثیر می گذارد.

برای دائمی کردن تغییر، باید یک متغیر $PATH در فایل های پیکربندی پوسته خود تعریف کنید. در اکثر توزیع‌های لینوکس، هنگام شروع یک جلسه جدید، متغیرهای محیطی از فایل‌های زیر خوانده می‌شوند:

  • فایل های پیکربندی پوسته جهانی مانند /etc/environment و /etc/profile. اگر می خواهید دایرکتوری جدید به همه اضافه شود از این فایل استفاده کنید کاربران سیستم$PATH.
  • فایل های پیکربندی برای پوسته های کاربر جداگانه. به عنوان مثال، اگر از Bash استفاده می کنید، می توانید متغیر $PATH را در فایل ~/.bashrc تنظیم کنید و اگر از Zsh استفاده می کنید، نام فایل ~/.zshrc است.

در این مثال، یک متغیر در فایل ~/.bashrc تنظیم می کنیم. فایل را باز کنید ویرایشگر متنو در آخر خط زیر را اضافه کنید:

نانو ~/.bashrc

صادرات PATH="$HOME/bin:$PATH"

فایل را ذخیره کنید و با استفاده از: مقدار $PATH جدید را در جلسه پوسته فعلی بارگذاری کنید:

منبع ~/.bashrc

برای تأیید اینکه دایرکتوری با موفقیت اضافه شده است، مقدار $PATH آن را با تایپ کردن چاپ کنید:

پژواک $PATH

نتیجه

افزودن دایرکتوری های جدید به کاربر یا جهانی $PATH بسیار ساده است. این به شما اجازه می دهد تا دستورات و اسکریپت های ذخیره شده در مکان های غیر استاندارد را بدون نیاز به وارد کردن مسیر کامل به فایل اجرایی اجرا کنید.

دستورالعمل های مشابه برای هر کدام اعمال می شود توزیع لینوکساز جمله CentOS، RHEL، Debian و Linux Mint.

در صورت داشتن هر گونه سوال در کامنت بگذارید.

آن چیست؟ بسیاری از دستوراتی که در خط فرمان وارد می کنید نیاز به استفاده از یک برنامه خارجی دارند که از سیستم فایل بارگذاری شده است. به عنوان مثال، دستوراتی مانند mkdir و wc در واقع در پوشه /bin قرار دارند.

وقتی دستوری را وارد می‌کنید که پوسته Bash آن را نمی‌شناسد، سعی می‌کند آن را به‌عنوان یک برنامه اجرا کند و اگر برنامه‌ای با آن نام پیدا نکرد، خطا را برمی‌گرداند. و این نه تنها در مورد دستورات اساسی که به آنها نگاه کردیم صدق می کند، زیرا از خط فرمان می توانید هر برنامه ای را اجرا کنید.


اما اگر فایلی وجود داشته باشد چطور سیستم لینوکسمی داند کدام برنامه ها را از کدام دایرکتوری ها اجرا کند؟ سیستم عامل از یک متغیر محیطی سیستم برای تعیین زیرمجموعه ای از پوشه ها برای جستجو در هنگام دریافت فرمان ناشناخته استفاده می کند. این متغیر PATH نام دارد و با دستور echo زیر نمایش داده می شود (نماد $ لازم است):

پژواک $PATH

خروجی این دستور مانند هفت مسیر پوشه مطلق زیر خواهد بود که با دو نقطه از هم جدا شده اند:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

هر بار که وارد یک ناشناخته می شوید دستورات لینوکسهر یک از پوشه های مشخص شده در متغیر محیطی را به ترتیب مشخص شده بررسی می کند و سعی می کند برنامه ای با همان نام پیدا کند. اگر برنامه پیدا شد، اجرا می شود. در غیر این صورت یک پیغام خطا نمایش داده می شود. اما اگر انگشترهای نقره مورد علاقه خود را به عنوان هدیه بخرید اشتباهی نیست. نقره هر زنی را تزئین می کند!

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

به عنوان مثال، شما ابزار دفترچه خاطرات را از اینترنت در پوشه خانگی خود دانلود کرده اید. اگر نام آن را در خط فرمان وارد کنید، یک پیغام خطا دریافت خواهید کرد زیرا در پوشه ای قرار دارد که در مسیر سیستم وجود ندارد. برای اجرای این برنامه خط زیر را وارد کنید (به یاد داشته باشید که علامت ~ مخفف پوشه اصلی شما است):

اگر آن را در پوشه ای خارج از مسیر مشخص شده خود ذخیره کرده اید، باید مسیر مطلق و نام فایل را برای اجرای برنامه وارد کنید.

البته فرض بر این است که diary یک برنامه مستقل ساده است که نیازی به نصب ندارد، زیرا اکثر برنامه های کاربردی اصلی، فایل اجرایی برنامه را در جایی در مسیر مشخص شده شما در طول مراحل نصب قرار می دهند. مثل این متغیر محیطی PATH، برای سلامتی خود از آن لذت ببرید!

صادرات PATH=~/opt/bin:$PATH

صادرات PATH=$PATH:~/opt/bin

9 راه حل وب فرم را برای "چگونه به درستی یک مسیر به PATH اضافه کنیم؟"

چیزهای ساده

PATH=$PATH:~/opt/bin PATH=~/opt/bin:$PATH

بسته به این که آیا می‌خواهید ~/opt/bin را در پایان (برای جستجوی همه دایرکتوری‌های دیگر اگر برنامه‌ای با نام یکسان در چندین فهرست وجود دارد) یا در ابتدا (برای جستجو قبل از همه فهرست‌های دیگر) اضافه کنید.

می توانید چندین ورودی را همزمان اضافه کنید. PATH=$PATH:~/opt/bin:~/opt/node/bin یا تغییرات در سفارش بسیار خوب است.

اگر متغیر قبلاً در محیط است، نیازی به صادرات ندارید: هر تغییری در مقدار متغیر در محیط منعکس می‌شود. PATH تقریباً همیشه در محیط است. همه سیستم های یونیکسآن را خیلی زود نصب کنید (معمولاً در اولین فرآیند، در واقع).

اگر PATH شما در اجزای مختلف ساخته شده است، ممکن است با ورودی های تکراری مواجه شوید. ببینید چگونه مسیری را به دایرکتوری منبع اضافه کنیم تا توسط یونیکس شناسایی شود، دستور چیست؟ و ورودی های $PATH تکراری را با استفاده از دستور awk حذف کنید تا از افزودن موارد تکراری یا حذف آنها جلوگیری کنید.

کجا قرار دادن

توجه داشته باشید که ~/.bash_rc توسط هیچ برنامه ای قابل خواندن نیست و ~/.bashrc فایل پیکربندی برای نمونه های bash تعاملی است. شما نباید متغیرهای محیطی را در ~/.bashrc تعریف کنید. مکان صحیح برای تعریف متغیرهای محیطی مانند PATH ~/.profile است (یا ~/.bash_profile اگر به پوسته های غیر bash نیاز ندارید). ببینید تفاوت آنها چیست و از کدام یک استفاده کنم؟

یادداشت هایی در مورد پوسته های غیرباش

در bash، ksh و zsh، export یک نحو خاص است و هر دو PATH=~/opt/bin:$PATH و export PATH=~/opt/bin:$PATH همه چیز را درست انجام می دهند. در سایر پوسته‌های Bourne/POSIX مانند dash (که در بسیاری از سیستم‌ها /bin/sh است)، صادرات مانند یک دستور عادی تجزیه می‌شود که به دو تفاوت دلالت می‌کند:

  • ~ فقط در ابتدای یک کلمه تجزیه می شود، به جز در تکالیف (به بخش "چگونه مسیری به فهرست منبع اضافه کنیم که توسط یونیکس شناسایی می شود، چه دستوری؟" را ببینید.
  • $PATH خارج از دو نقل قول شکسته می شود اگر PATH دارای فاصله باشد یا \[*؟ ،

بنابراین در پوسته های خط تیره، صادرات PATH=~/opt/bin:$PATH PATH را روی رشته تحت اللفظی ~/opt/bin/ تنظیم می کند: به دنبال آن مقدار PATH تا رتبه اول قرار می گیرد. PATH=~/opt/bin:$PATH (تخصیص فازی) به نقل قول نیازی ندارد و کار را درست انجام می دهد. اگر می‌خواهید از صادرات در یک اسکریپت قابل حمل استفاده کنید، باید export PATH="$HOME/opt/bin:$PATH" را بنویسید.

¹ این در مورد موشک های Bourne صدق نمی کند (مانند پوسته Bourne واقعی، نه پوسته های سبک POSIX مدرن)، اما بعید است که این روزها با پوسته های قدیمی روبرو شوید.

به هر حال کار می کند، اما آنها همان کار را انجام نمی دهند: عناصر PATH از چپ به راست بررسی می شوند. در مثال اول فایل های اجرایی in ~/opt/bin بر موارد نصب شده در /usr/bin ارجحیت دارد، که ممکن است آن چیزی باشد که شما می خواهید یا نباشد.

مخصوصاً از منظر امنیتی، اضافه کردن مسیرها به جلو خطرناک است، زیرا اگر کسی بتواند به ~/opt/bin دسترسی نوشتن داشته باشد، می‌تواند برای مثال، lهای دیگری را که احتمالاً به جای / استفاده می‌کنید، قرار دهد. bin/ls بدون توجه حالا مثل ssh یا مرورگر یا انتخاب خود را تصور کنید... (همان کار را می توان سه بار در مسیر شما انجام داد.)

من با سوال 2 گیج شدم (چون از سوال حذف شد زیرا مربوط به یک موضوع غیرمرتبط بود):

چی روش موثراضافه کردن مسیرهای اضافی به خطوط مختلف؟ در ابتدا فکر کردم این ممکن است این کار را انجام دهد:

صادرات PATH=$PATH:~/opt/bin صادرات PATH=$PATH:~/opt/node/bin

اما اینطور نیست زیرا تخصیص دوم نه تنها ~/opt/node/bin را اضافه می کند، بلکه تمام مسیرهای قبلاً اختصاص داده شده را نیز اضافه می کند.

این یک راه حل ممکن است:

صادرات PATH=$PATH:~/opt/bin:~/opt/node/bin

اما برای خوانایی ترجیح می دهم در هر مسیر یک مقصد داشته باشم.

اگر تو بگی

PATH=~/opt/bin

این همه،آنچه در مسیر شما خواهد بود. PATH فقط یک متغیر محیطی است و اگر می خواهید به PATH اضافه کنید، باید متغیر را دقیقاً با محتوای مورد نظر خود بازسازی کنید. بنابراین آنچه شما به عنوان مثال در سوال 2 می آورید دقیقاً همان کاری است که می خواهید انجام دهید، مگر اینکه من کاملاً هدف سوال را از دست داده باشم.

من از هر دو فرم در کدم استفاده می کنم. من یک نمایه کلی دارم که روی هر کامپیوتری که روی آن کار می‌کنم نصب می‌کنم که به شکل زیر است تا فهرست‌های گمشده احتمالی را در خود جای دهد:

صادرات PATH=/opt/bin:/usr/local/bin:/usr/contrib/bin:/bin:/usr/bin:/usr/sbin:/usr/bin/X11 # افزودن موارد اختیاری به مسیر برای bindir در $HOME/local/bin $HOME/bin; انجام دهید اگر [ -d $bindir ]; سپس PATH=$PATH:$(bindir) فی انجام شد

لینوکس مسیر جستجوی اجرایی را از محیط $PATH تعیین می کند. برای افزودن دایرکتوری /data/myscripts به بالای محیط $PATH، از موارد زیر استفاده کنید:

PATH=/data/myscripts:$PATH

برای اضافه کردن این دایرکتوری به انتهای مسیر، از دستور زیر استفاده کنید:

PATH=$PATH:/data/myscripts

اما موارد قبلی کافی نیستند زیرا وقتی یک متغیر محیطی را در داخل یک اسکریپت تنظیم می کنید، این تغییر فقط در داخل اسکریپت اعمال می شود. این محدودیت تنها به دو صورت محدود می شود:

  • اگر یک متغیر محیطی را در یک اسکریپت صادر کنید، در هر برنامه‌ای که توسط اسکریپت خوانده می‌شود موثر است. توجه داشته باشید که این در برنامه ای به نام اسکریپت موثر نیست.
  • اگر برنامه ای که اسکریپت را فراخوانی می کند، این کار را به جای فراخوانی با شامل کردن انجام می دهد، هر گونه تغییر محیط در اسکریپت روی برنامه فراخوانی موثر است. این شامل کردن را می توان با استفاده از دستور نقطه یا دستور منبع انجام داد.

منبع $HOME/myscript.sh $HOME/myscript.sh

گنجاندن اساساً شامل اسکریپت "قابل تماس" در اسکریپت "تماس" می شود. این شبیه به #include در C است. بنابراین در داخل یک اسکریپت یا برنامه فراخوانی موثر است. اما مطمئناً این برای هیچ برنامه یا اسکریپتی که توسط برنامه فراخوانی فراخوانی می شود مؤثر نیست. برای اینکه آن را تا زنجیره تماس موثر کنید، باید تنظیمات متغیر محیطی را با استفاده از دستور صادرات دنبال کنید.

به عنوان مثال، برنامه پوسته bash شامل محتویات فایل .bash_profile با گنجاندن است. بنابراین، 2 خط زیر را به .bash_profile اضافه کنید:

PATH=$PATH:/data/myscripts صادرات PATH

به طور موثر آن 2 خط کد را در یک برنامه bash قرار می دهد. بنابراین، در متغیر bash$PATH شامل $HOME/myscript.sh می‌شود و به دلیل صدور بیانیه، هر برنامه‌ای که توسط bash خوانده می‌شود، $PATH اصلاح می‌شود. و از آنجایی که هر برنامه ای که از دستور bash راه اندازی می شود توسط bash فراخوانی می شود، مسیر جدید برای هر چیزی که از دستور bash راه اندازی می کنید معتبر است.

نکته اصلی این است که برای افزودن یک فهرست جدید به مسیر، باید دایرکتوری را به متغیر محیطی $PATH در یک اسکریپت موجود در پوسته اضافه یا اضافه کنید، و باید متغیر محیطی $PATH را صادر کنید.

اطلاعات تکمیلیاینجا

مدتی است که دو تابع pathadd و pathrm را با خود نگه داشته ام که به اضافه کردن عناصر به یک مسیر بدون نگرانی در مورد تکراری شدن کمک می کند.

pathadd یک آرگومان مسیر و یک آرگومان پس از اختیاری می گیرد که اگر اضافه شود به PATH اضافه می شود در غیر این صورت آن را اضافه می کند.

تقریباً در هر شرایطی، اگر مسیری را اضافه کنید، احتمالاً می‌خواهید هر چیزی را که قبلاً در مسیر وجود دارد لغو کنید، بنابراین من ترجیح می‌دهم به صورت پیش‌فرض اضافه کنم.

Pathadd() (newelement=$(1%/) اگر [ -d "$1" ] && ! echo $PATH | grep -E -q "(^|:)$newelement($|:)" ؛ سپس اگر [ " $2" = "after" ] ; then PATH="$PATH:$newelement" else PATH="$newelement:$PATH" fi fi ) pathrm() ( PATH="$(echo $PATH | sed -e "s; \(^\|:\)$(1%/)\(:\|\$\);\1\2;g" -e "s;^:\|:$;;g" -e "s ;::;:;g")" )

آنها را در هر اسکریپتی که می خواهید برای تغییر محیط PATH قرار دهید و اکنون می توانید این کار را انجام دهید.

Pathadd "/foo/bar" pathadd "/baz/bat" پس از صادرات PATH

تضمین می شود که اگر مسیری از قبل وجود داشته باشد، به آن اضافه نمی کنید. اگر اکنون می خواهید /baz/bat در شروع باشد.

Pathrm "/baz/bat" pathadd "/baz/bat" صادرات PATH

اکنون می توان هر مسیری را به جبهه آورد که قبلاً در مسیری بدون دوبرابر قرار گرفته باشد.

من نمی توانم برای توزیع های دیگر صحبت کنم، اما اوبونتو یک فایل، /etc/environment دارد که مسیر جستجوی استاندارد برای همه کاربران است. از آنجایی که کامپیوتر من فقط توسط من استفاده می شود، من هر دایرکتوری را که می خواهم در مسیر خود قرار می دهم، به شرطی که یک اضافه موقت باشد که در اسکریپت قرار می دهم.

راه حل من اینجاست:

PATH=$(echo -n $PATH | awk -v RS=: -v ORS=: "!x[$0]++" | sed "s/\(.*\).\(1\)/\1 /")

آستر سبک زیبا که اثری از خود بر جای نمی گذارد:

برای من (در Mac OS X 10.9.5) افزودن نام مسیر (به عنوان مثال /mypathname) به فایل /etc/paths بسیار خوب کار کرد.

قبل از ویرایش، echo $PATH برگردانده می‌شود:

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

پس از ویرایش /etc/paths و راه اندازی مجدد پوسته، متغیر $PATH با /pathname اضافه می شود. در واقع، echo $PATH برمی‌گرداند:

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/mypathname

اتفاقی که افتاد این بود که /mypathname به $PATH اضافه شد.

برای افزودن یک مسیر جدید به محیط PATH PATH:

صادرات PATH=$PATH:/new-path/

برای اعمال این تغییر برای هر پوسته ای که باز می کنید، آن را به فایلی اضافه کنید که پوسته هنگام فراخوانی آن را فراخوانی می کند. در پوسته های مختلف این می تواند باشد:

  • Bash Shell: ~/.bash_profile، ~/.bashrc یا پروفایل
  • Korn Shell: ~/.kshrc یا .profile
  • Z Shell: ~/.zshrc یا .zprofile

مثلا

# صادرات PATH=$PATH:/root/learning/bin/ # منبع ~/.bashrc # echo $PATH

می توانید مسیر ارائه شده را در خروجی بالا مشاهده کنید.

همه فایل‌ها در لینوکس دارای یک آدرس خاص در سیستم فایل هستند که با استفاده از یک فایل منیجر یا ابزارهای کنسول می‌توانیم به آنها دسترسی داشته باشیم. این یک موضوع نسبتاً ساده است، اما بسیاری از مبتدیان با آن مشکل دارند.

در مقاله کوتاه امروز ما به این خواهیم پرداخت که مسیر فایل لینوکس چیست، چه چیزی می تواند باشد، چگونه آن را به درستی بنویسیم و موارد دیگر. اگر قبلاً با این مشکل روبرو بودید ، پس از خواندن مقاله همه چیز کاملاً روشن می شود.

مسیرهای فایل در لینوکس

سیستم فایل لینوکس با ویندوز بسیار متفاوت است. ما ساختار آن را در نظر نخواهیم گرفت؛ این کار قبلا انجام شد. ما روی کار با فایل ها تمرکز خواهیم کرد.

مهم‌ترین تفاوت این است که آدرس فایل از درایو شروع نمی‌شود، مثلاً از C:\ یا D:\ همانطور که در ویندوز اتفاق می‌افتد، بلکه از ریشه، دایرکتوری سیستم ریشه که بقیه به آن متصل هستند شروع می‌شود. آدرس او - /. و در اینجا باید در مورد آدرس ها صحبت کنیم. مسیرهای فایل لینوکس از اسلش "/" برای جدا کردن دایرکتوری‌ها در آدرس استفاده می‌کنند، و این با چیزی که شما در ویندوز - \ به دیدن آن عادت دارید متفاوت است.

به عنوان مثال، اگر در ویندوز پرمسیر فایل روی دسکتاپ شبیه C:\Users\Sergiy\Desktop\ بود، سپس مسیر فایل در لینوکس به سادگی /home/sergiy/desktop/ خواهد بود. با این، همه چیز تا اینجا ساده و واضح است. اما مشکلات بیشتر به وجود می آیند.

در سیستم عامل لینوکس، چندین نوع مسیر فایل وجود دارد. بیایید ببینیم چه مسیرهایی در لینوکس وجود دارد:

  • مسیر لینوکس کامل و مطلق از ریشه سیستم فایل- قبلاً این مسیر را در مثال بالا دیده اید، از ریشه "/" شروع می شود و کل مسیر فایل را توصیف می کند.
  • مسیر نسبی لینوکس- این مسیر فایل نسبت به پوشه فعلی است؛ چنین مسیرهایی اغلب باعث سردرگمی می شوند.
  • مسیر نسبت به پوشه اصلی کاربر فعلی.- مسیر در سیستم فایل، اما نه از ریشه، بلکه از پوشه کاربر فعلی.

بیایید اکنون نگاهی دقیق‌تر به شکل ظاهری این مسیرها در لینوکس بیندازیم، و همچنین به چند مثال نگاه می‌کنیم تا کاملاً واضح باشد. برای نمایش، از ابزار ls استفاده می کنیم که برای مشاهده محتویات دایرکتوری ها طراحی شده است.

به عنوان مثال، ما یک دایرکتوری مانند این در پوشه اصلی خود داریم که چهار فایل در آن وجود دارد:

مسیر کامل لینوکس به یکی از فایل ها به این صورت است:

ls /home/sergiy/tmp/file1

این در حال حاضر یک مسیر نسبی لینوکس است که از پوشه اصلی شروع می شود و ~/ تعیین شده است. توجه داشته باشید، نه ~، یعنی ~/. سپس می توانید زیر پوشه ها را در مورد ما tmp مشخص کنید:

خوب، یا مسیر فایل در لینوکس، نسبت به پوشه فعلی:

پیوند اول به پوشه فعلی (..) و دومی (..) به پوشه بالاتر اشاره می کند. این امر حتی امکانات بیشتری را برای ناوبری کاتالوگ باز می کند. به عنوان مثال، برای مراجعه به یک فایل در پوشه فعلی، می توانید از ساختار زیر استفاده کنید:

این در هنگام مشاهده محتویات یک فایل فایده ای ندارد. اما در هنگام اجرای برنامه بسیار مهم است. زیرا برنامه ابتدا در محیط PATH و تنها پس از آن در این پوشه جستجو می شود. بنابراین، اگر شما نیاز به اجرای برنامه ای دارید که در پوشه فعلی قرار دارد و دقیقاً همان برنامه موجود در پوشه /bin نامیده می شود، بدون پیوند صریح باید به دنبال فایل در پوشه فعلی بگردید، هیچ چیز کار نخواهد کرد

چنین ساختارهایی می توانند اغلب هنگام کامپایل برنامه ها رخ دهند. شما می توانید از تمام این نمادها و مسیرهای فایل لینوکس نه تنها در ترمینال، بلکه در هر کدام استفاده کنید مدیر فایل، که می تواند بسیار راحت باشد.

ولی ترمینال لینوکسحتی فرصت های بیشتری را فراهم می کند. شما می‌توانید از کاراکترهای عام ساده مستقیماً در آدرس‌های فایل یا دایرکتوری استفاده کنید. به عنوان مثال، می توانید تمام فایل هایی که با f شروع می شوند را فهرست کنید:

یا حتی می توانید نه تنها در پوشه tmp، بلکه در هر زیر پوشه پوشه اصلی خود جستجو کنید:

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

نتیجه گیری

همین. اکنون همه چیزهایی را که نه تنها برای نوشتن صحیح مسیر به آن نیاز دارید، می دانید فایل لینوکس، بلکه اقدامات پیچیده تری را نیز انجام دهید، مانند جستجوی فایل ها یا پیمایش در دایرکتوری ها با استفاده از دستور cd. اگر سوالی دارید، در نظرات بپرسید!

پست های مرتبط:


من تعجب می کنم که مسیر جدید کجا باید به متغیر محیطی PATH اضافه شود. من می دانم که این را می توان با ویرایش .bashrc (برای مثال) انجام داد، اما نحوه انجام این کار مشخص نیست.

بدین ترتیب:

صادرات PATH=~/opt/bin:$PATH

صادرات PATH=$PATH:~/opt/bin

11 پاسخ

مواد ساده

PATH=$PATH:~/opt/bin PATH=~/opt/bin:$PATH

بسته به اینکه می خواهید کد ~/opt/bin را به انتها (برای جستجوی همه دایرکتوری های دیگر در صورتی که برنامه ای با نام یکسان در چندین دایرکتوری وجود دارد) یا به ابتدا (برای جستجو قبل از همه دایرکتوری های دیگر) اضافه کنید.

می توانید چندین ورودی را همزمان اضافه کنید. PATH=$PATH:~/opt/bin:~/opt/node/bin یا تغییرات در سفارش بسیار خوب است.

اگر متغیر قبلاً در محیط است، نیازی به صادرات ندارید: هر تغییری در مقدار متغیر در محیط منعکس می‌شود.¹ PATH تقریباً همیشه در محیط است. همه سیستم های یونیکس آن را خیلی زود نصب می کنند (معمولاً در اولین فرآیند، در واقع).

اگر PATH شما توسط مؤلفه های مختلف ایجاد شده باشد، ممکن است با ورودی های تکراری مواجه شوید. ببینید چگونه یک مسیر به فهرست اصلی خود اضافه کنید که توسط یونیکس شناسایی شود، کدام دستور؟ و ورودی‌های $PATH تکراری را با استفاده از دستور awk حذف کنید تا از تکراری شدن اجتناب کنید یا آنها را حذف کنید.

کجا قرار دادن

توجه داشته باشید که ~/.bash_rc توسط هیچ برنامه ای قابل خواندن نیست و ~/.bashrc فایل پیکربندی برای نمونه های bash تعاملی است. شما نباید متغیرهای محیطی را در ~/.bashrc تعریف کنید. مکان صحیح برای تعریف متغیرهای محیطی مانند PATH ~/.profile است (یا ~/.bash_profile اگر پوسته هایی غیر از bash را دوست ندارید). ببینید تفاوت آنها چیست و از کدام یک استفاده کنم؟

یادداشت هایی در مورد پوسته های غیرباش

در bash، ksh و zsh، export یک نحو خاص است و هر دو PATH=~/opt/bin:$PATH و export PATH=~/opt/bin:$PATH حتی کار درست را انجام می دهند. در سایر پوسته‌های Bourne/POSIX، مانند dash (که در بسیاری از سیستم‌ها /bin/sh است)، صادرات مانند یک دستور عادی تجزیه می‌شود که دو تفاوت را نشان می‌دهد:

  • ~ فقط در ابتدای کلمه تجزیه می شود، به جز در تکالیف (نگاه کنید به چگونه یک مسیر دایرکتوری خانه را اضافه کنم که توسط یونیکس شناسایی می شود که به دستور نیاز دارد؟ ;
  • $PATH خارجی نقل قول های دوگانهاگر PATH دارای فاصله باشد یا \[*؟ .

بنابراین، در پوسته‌هایی مانند dash، صادرات PATH=~/opt/bin:$PATH PATH را روی رشته تحت اللفظی ~/opt/bin/: به دنبال آن مقدار PATH تا رتبه اول تنظیم می‌کند. PATH=~/opt/bin:$PATH (تخصیص ساده) به نقل قول نیاز ندارد و همه چیز را درست انجام می دهد. اگر می‌خواهید از صادرات در یک اسکریپت قابل حمل استفاده کنید، باید صادرات PATH="$HOME/opt/bin:$PATH" یا PATH=~/opt/bin:$PATH صادرات PATH (یا PATH=$HOME/opt) را بنویسید. /bin: $PATH صادرات PATH برای قابلیت حمل حتی به پوسته Bourne، که صادرات var=value را نمی پذیرد و توسعه tilde را انجام نمی دهد.

¹ این در پوسته های Bourne صادق نبود (مانند پوسته Bourne واقعی، نه پوسته های سبک POSIX مدرن)، اما بعید است که این روزها با پوسته های قدیمی مواجه شوید. زیر>

در هر صورت کار می کند، اما آنها همان کار را انجام نمی دهند: عناصر PATH از چپ به راست بررسی می شوند. در مثال اول، فایل های اجرایی در ~/opt/bin نسبت به موارد نصب شده در /usr/bin اولویت دارند، که ممکن است آن چیزی باشد که شما می خواهید یا نباشد.

به ویژه، از منظر امنیتی، افزودن مسیرها به جلو خطرناک است، زیرا اگر شخصی بتواند دسترسی نوشتن به ~/opt/bin شما داشته باشد، ممکن است برای مثال ls دیگری قرار دهد، که احتمالاً به جای آن /bin/ls از آن استفاده خواهید کرد. بدون توجه حالا همین را برای ssh یا مرورگر یا انتخاب خود تصور کنید... (همان چیز را سه بار در مسیر خود قرار دهید.)

من در مورد سوال 2 گیج شده ام (چون از سوال حذف شد زیرا مربوط به نه بود مشکل مرتبط):

یک راه کارآمد برای افزودن مسیرهای اضافی به خطوط مختلف چیست؟ در ابتدا فکر کردم این ممکن است این کار را انجام دهد:

صادرات PATH=$PATH:~/opt/bin صادرات PATH=$PATH:~/opt/node/bin

اما این به این دلیل نیست که تخصیص دوم نه تنها ~/opt/node/bin را اضافه می کند، بلکه PATH قبلاً اختصاص داده شده را نیز اضافه می کند.

این یک راه حل ممکن است:

صادرات PATH=$PATH:~/opt/bin:~/opt/node/bin

اما برای خوانایی ترجیح می دهم در هر مسیر یک مقصد داشته باشم.

اگر تو بگی

PATH=~/opt/bin

این همه، که در PATH شما خواهد بود. PATH فقط یک متغیر محیطی است و اگر می خواهید به PATH اضافه کنید، باید متغیر را دقیقاً با محتوای مورد نظر خود بازسازی کنید. یعنی چیزی که به عنوان مثال در سوال 2 می آورید دقیقاً همان کاری است که می خواهید انجام دهید، مگر اینکه من کاملاً از موضوع سوال غافل باشم.

من از هر دو فرم در کدم استفاده می کنم. من یک نمایه کلی دارم که روی هر دستگاهی که روی آن کار می‌کنم نصب می‌کنم که شبیه این است، تا فهرست‌های گمشده را میزبانی کنم:

صادرات PATH=/opt/bin:/usr/local/bin:/usr/contrib/bin:/bin:/usr/bin:/usr/sbin:/usr/bin/X11 # افزودن موارد اختیاری به مسیر برای bindir در $HOME/local/bin $HOME/bin; انجام دهید اگر [ -d $bindir ]; سپس PATH=$PATH:$(bindir) فی انجام شد

لینوکس مسیر جستجوی اجرایی را با متغیر محیطی $PATH تعریف می کند. برای افزودن دایرکتوری /data/myscripts به ابتدای متغیر محیطی $PATH، از موارد زیر استفاده کنید:

PATH=/data/myscripts:$PATH

برای اضافه کردن این دایرکتوری به انتهای مسیر، از دستور زیر استفاده کنید:

PATH=$PATH:/data/myscripts

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

  • اگر یک متغیر محیطی را در یک اسکریپت صادر کنید، در هر برنامه ای که توسط اسکریپت فراخوانی می شود مؤثر است. توجه داشته باشید که در برنامه ای که اسکریپت نامیده می شود این کار موثر نیست.
  • اگر برنامه ای که اسکریپت را فراخوانی می کند، این کار را به جای فراخوانی با شامل کردن انجام می دهد، هر گونه تغییر محیط در اسکریپت روی برنامه فراخوانی موثر است. این شامل کردن را می توان با استفاده از دستور نقطه یا دستور منبع انجام داد.

منبع $HOME/myscript.sh $HOME/myscript.sh

گنجاندن اساساً شامل اسکریپت "قابل تماس" در اسکریپت "تماس" می شود. این شبیه به #include در C است. بنابراین در داخل یک اسکریپت یا برنامه فراخوانی موثر است. اما مطمئناً این برای هیچ برنامه یا اسکریپتی که توسط برنامه فراخوانی فراخوانی می شود مؤثر نیست. برای اینکه آن را تا زنجیره تماس موثر کنید، باید تنظیمات متغیر محیطی را با استفاده از دستور صادرات دنبال کنید.

به عنوان مثال، برنامه پوسته bash شامل محتویات فایل .bash_profile با گنجاندن است. بنابراین 2 خط زیر را در .bash_profile قرار دهید:

PATH=$PATH:/data/myscripts صادرات PATH

به طور موثر آن 2 خط کد را در یک برنامه bash قرار می دهد. بنابراین در bash، متغیر $PATH شامل $HOME/myscript.sh است، و به دلیل بیانیه صادرات، هر برنامه ای که توسط bash خوانده می شود، متغیر $PATH را تغییر می دهد. و از آنجایی که هر برنامه‌ای که از دستور bash راه‌اندازی می‌کنید با bash فراخوانی می‌شود، مسیر جدید برای هر چیزی که از دستور bash راه‌اندازی می‌کنید اعمال می‌شود.

نکته اصلی این است که برای افزودن یک فهرست جدید به مسیر، باید دایرکتوری را به متغیر محیطی $PATH در یک اسکریپت موجود در پوسته اضافه یا اضافه کنید، و باید متغیر محیطی $PATH را صادر کنید.

من مدتی است که دو تابع pathadd و pathrm را با خود نگه داشته ام که به اضافه کردن عناصر به یک مسیر بدون نگرانی در مورد تکراری بودن کمک می کند.

pathadd یک آرگومان مسیر و یک آرگومان پس از اختیاری می گیرد که اگر اضافه شود به PATH اضافه می شود، در غیر این صورت آن را اضافه می کند.

در هر شرایطی، اگر مسیری را اضافه می‌کنید، احتمالاً می‌خواهید هر چیزی را که قبلاً در مسیر است لغو کنید، بنابراین ترجیح می‌دهم به‌طور پیش‌فرض اضافه کنم.

Pathadd() (newelement=$(1%/) اگر [ -d "$1" ] && ! echo $PATH | grep -E -q "(^|:)$newelement($|:)" ؛ سپس اگر [ " $2" = "after" ] ; then PATH="$PATH:$newelement" else PATH="$newelement:$PATH" fi fi ) pathrm() ( PATH="$(echo $PATH | sed -e "s; \(^\|:\)$(1%/)\(:\|\$\);\1\2;g" -e "s;^:\|:$;;g" -e "s ;::;:;g")" )

آنها را در هر اسکریپتی که می خواهید برای تغییر محیط PATH قرار دهید و اکنون کار شما تمام شده است.

Pathadd "/foo/bar" pathadd "/baz/bat" پس از صادرات PATH

شما تضمین می کنید که اگر مسیری از قبل وجود داشته باشد، آن را اضافه نمی کنید. اگر می خواهید ابتدا /baz/bat اجرا شود.

Pathrm "/baz/bat" pathadd "/baz/bat" صادرات PATH

اکنون می توان هر مسیری را به جلو منتقل کرد اگر قبلاً در مسیری بدون دوبرابر شدن باشد.

روش افزودن / آماده سازی ضد گلوله

ملاحظات زیادی در انتخاب افزودن و افزودن وجود دارد. بسیاری از آنها در پاسخ های دیگر پوشش داده شده است، بنابراین من آنها را در اینجا تکرار نمی کنم.

نکته مهم این است که حتی اگر اسکریپت‌های سیستم از این (من نمی‌دانم چرا) *1 استفاده نمی‌کنند، این یک راه ضد گلوله برای اضافه کردن یک مسیر (مثلا $HOME/bin) به متغیر محیطی PATH است.

PATH="$(PATH:+$(PATH):)$HOME/bin"

برای اضافه کردن (به جای PATH="$PATH:$HOME/bin") و

PATH="$HOME/bin$(PATH:+:$(PATH))"

برای اضافه کردن (به جای PATH="$HOME/bin:$PATH")

وقتی $PATH در ابتدا خالی است، از یک کولون پیشرو/پایان کاذب جلوگیری می‌کند، که می‌تواند عوارض جانبی ناخواسته‌ای داشته باشد و یافتن آن می‌تواند کابوس باشد (این پاسخ به طور خلاصه به مورد awk-way می‌پردازد).

$(پارامتر:+word)

اگر پارامتر null یا تنظیم نشده باشد، چیزی جایگزین نمی شود، در غیر این صورت جایگزین می شود کلمه کلمه.

بنابراین $(PATH:+$(PATH):) گسترش می یابد به: 1) هیچ چیز اگر PATH تهی یا تنظیم نشده باشد، 2) $(PATH): اگر PATH تنظیم شده باشد.

توجه داشته باشید. این برای bash است.

*1 من تازه متوجه شدم که اسکریپت هایی مانند devtoolset-6/enable از این استفاده می کنند، $ cat /opt/rh/devtoolset-6/enable # متغیرهای محیط عمومی صادرات PATH=/opt/rh/devtoolset-6/root/usr /bin $(PATH:+:$(PATH)) ...

من نمی توانم برای توزیع های دیگر صحبت کنم، اما اوبونتو یک فایل، /etc/environment دارد که مسیر جستجوی پیش فرض برای همه کاربران است. از آنجایی که کامپیوتر من فقط توسط من استفاده می شود، من هر دایرکتوری را که می خواهم در مسیر خود قرار می دهم مگر اینکه یک اضافه موقت باشد که در اسکریپت قرار داده ام.

برای من (در Mac OS X 10.9.5) افزودن نام مسیر (به عنوان مثال /mypathname) به فایل /etc/paths بسیار خوب کار کرد.

قبل از ویرایش، echo $PATH برگردانده می‌شود:

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

پس از ویرایش /etc/paths و راه اندازی مجدد پوسته، متغیر $PATH با /pathname اضافه می شود. در واقع، echo $PATH برمی‌گرداند:

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/mypathname

اتفاقی که افتاد این بود که /mypathname به متغیر $PATH اضافه شد.