Linux yo'li papka yo'llarini qanday belgilash kerak. PATH muhit o'zgaruvchisi. Linuxda foydalanuvchi va tizim muhiti o'zgaruvchilarini qo'shish

Buyruqni kiritganingizda buyruq qatori, siz asosan qobiqga berilgan nom bilan bajariladigan faylni ishga tushirishni aytasiz. Linuxda bular bajariladigan dasturlar ls kabi find, file va boshqalar tizimingizda bir nechta turli kataloglarda yashaydi. Ushbu kataloglarda saqlangan bajariladigan ruxsatlarga ega har qanday faylni istalgan joydan ishga tushirish mumkin. Bajariladigan dasturlarni o'z ichiga olgan eng keng tarqalgan kataloglar /bin, /sbin, /usr/sbin, /usr/local/bin va /usr/local/sbin.

Qanday qilib qobiq bajariladigan dasturlarni qidirishni qaysi kataloglardan biladi yoki qobiq butun davomida qidiradi fayl tizimi?

Javob oddiy. Siz buyruq berganingizda, qobiq foydalanuvchining $PATH o'zgaruvchisida ko'rsatilgan barcha kataloglarni shu nomdagi bajariladigan fayl uchun qidiradi.

Ushbu maqola sizga $PATH o'zgaruvchisi tizimiga kataloglarni qanday qo'shishni ko'rsatadi.

Linuxda $PATH nima

$PATH muhit oʻzgaruvchisi koloniyali kataloglar roʻyxati boʻlib, u bajariladigan fayllarni qaysi kataloglardan qidirish kerakligini aytadi.

$PATH o'zgaruvchingizda qaysi kataloglar mavjudligini tekshirish uchun siz printenv yoki echo buyrug'idan foydalanishingiz mumkin:

Echo $PATH

Chiqish quyidagicha ko'rinadi:

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

Agar sizda ikkita turli katalogda joylashgan bir xil nomli ikkita bajariladigan fayl bo'lsa, qobiq $PATH da birinchi bo'lib kelgan katalogdagi faylni ishga tushiradi.

$PATH-ga katalog qo'shilmoqda

$PATH o'zgaruvchingizga boshqa kataloglarni qo'shishingiz mumkin bo'lgan holatlar mavjud. Misol uchun, ba'zi dasturlar turli joylarda o'rnatilgan bo'lishi mumkin yoki siz shaxsiy yozuvlaringiz uchun maxsus katalogga ega bo'lishni xohlaysiz, lekin ularni bajariladigan fayllarga mutlaq yo'lni ko'rsatmasdan ishga tushirishingiz mumkin. Buning uchun siz faqat $PATH-ga katalogni qo'shishingiz kerak.

Aytaylik, sizning uy katalogingizda siz qobiq skriptlarini saqlaydigan bin deb nomlangan katalogingiz bor. $PATH o'zgaruvchingizga katalog qo'shish uchun:

Eksport buyrug'i o'zgartirilgan o'zgaruvchini qobiq jarayonlarining ichki muhitlariga eksport qiladi.

Endi siz bajariladigan faylga toʻliq yoʻlni koʻrsatmasdan, bajariladigan skript nomini kiritish orqali skriptlaringizni ishga tushirishingiz mumkin.

Biroq, bu o'zgarish vaqtinchalik va faqat joriy qobiq sessiyasiga ta'sir qiladi.

O'zgartirishni doimiy qilish uchun siz qobiq konfiguratsiya fayllarida $PATH o'zgaruvchisini belgilashingiz kerak. Ko'pgina Linux distributivlarida yangi seansni boshlashda muhit o'zgaruvchilari quyidagi fayllardan o'qiladi:

  • /etc/environment va /etc/profile kabi global qobiq konfiguratsiya fayllari. Yangi katalog hammaga qo'shilishini istasangiz, ushbu fayldan foydalaning tizim foydalanuvchilari$PATH.
  • Shaxsiy foydalanuvchi qobiqlari uchun konfiguratsiya fayllari. Misol uchun, agar siz Bash-dan foydalansangiz, ~/.bashrc faylida $PATH o'zgaruvchisini o'rnatishingiz mumkin, agar siz Zsh dan foydalansangiz, fayl nomi ~/.zshrc bo'ladi.

Ushbu misolda biz ~/.bashrc faylida o'zgaruvchini o'rnatamiz. Faylni oching matn muharriri va oxiriga quyidagi qatorni qo'shing:

Nano ~/.bashrc

PATH="$HOME/bin:$PATH"ni eksport qilish

Faylni saqlang va yangi $PATH qiymatini joriy qobiq seansiga quyidagidan foydalanib yuklang:

Manba ~/.bashrc

Katalog muvaffaqiyatli qo'shilganligini tasdiqlash uchun uning $PATH qiymatini yozib chop eting:

Echo $PATH

Xulosa

Foydalanuvchiga yoki global $PATH-ga yangi kataloglarni qo'shish juda oddiy. Bu sizga standart bo'lmagan joylarda saqlangan buyruqlar va skriptlarni bajariladigan faylga to'liq yo'lni kiritmasdan ishga tushirish imkonini beradi.

Xuddi shu ko'rsatmalar hamma uchun amal qiladi Linux tarqatish, jumladan, CentOS, RHEL, Debian va Linux Mint.

Savollaringiz bo'lsa, sharh qoldiring.

Bu nima? Buyruqlar satriga kiritilgan ko'pgina buyruqlar fayl tizimidan yuklangan tashqi dasturdan foydalanishni talab qiladi. Masalan, mkdir va wc kabi buyruqlar aslida /bin papkasida joylashgan.

Bash qobig'i tanimaydigan ko'rsatmani kiritganingizda, u uni dastur sifatida bajarishga harakat qiladi va shu nomdagi dasturni topmasa, xatolik qaytaradi. Va bu nafaqat biz ko'rib chiqqan asosiy buyruqlarga taalluqlidir, chunki buyruq satridan istalgan dasturni ishga tushirishingiz mumkin.


Lekin qanday qilib fayl mavjud bo'lsa Linux tizimi qaysi dasturlarni qaysi kataloglardan ishga tushirishni biladimi? OT noma'lum buyruqni qabul qilganda qidirish uchun papkalar to'plamini belgilash uchun tizim muhiti o'zgaruvchisidan foydalanadi. Ushbu o'zgaruvchi PATH deb ataladi va uni quyidagi echo buyrug'i bilan ko'rsatish mumkin ($ belgisi kerak):

Echo $PATH

Ushbu buyruqning chiqishi ikki nuqta bilan ajratilgan quyidagi ettita mutlaq papka yo'liga o'xshaydi:

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

Har safar noma'lumga kirganingizda Linux buyruqlari muhit o'zgaruvchisida ko'rsatilgan papkalarning har birini belgilangan tartibda ko'rib chiqadi va bir xil nomdagi dasturni topishga harakat qiladi. Agar dastur topilsa, u ishlaydi; aks holda xato xabari ko'rsatiladi. Ammo sevimli kumush uzuklaringizni sovg'a sifatida sotib olsangiz, xato bo'lmaydi. Kumush har qanday ayolni bezatadi!

Ushbu ettita papka taqdim etadi oson kirish dagi barcha asosiy dasturlarga operatsion tizim, shu jumladan. Ushbu ettita papkadan tashqarida bo'lgan har qanday dasturni buyruq satriga ularning nomini kiritish orqali ishga tushirish mumkin emas.

Masalan, siz kunlik yordam dasturini Internetdan uy papkangizga yuklab oldingiz. Agar siz uning nomini buyruq satriga kiritsangiz, xato xabari olasiz, chunki u tizim yo'liga kiritilmagan papkada. Ushbu dasturni ishga tushirish uchun quyidagi qatorni kiriting (esda tutingki, ~ belgisi uy papkangizning stenografiyasidir):

Agar siz uni belgilangan yo'lingizdan tashqaridagi jildga saqlagan bo'lsangiz, yordamchi dasturni ishga tushirish uchun mutlaq yo'l va fayl nomini kiritishingiz kerak bo'ladi.

Albatta, kundalik bu o'rnatishni talab qilmaydigan oddiy mustaqil dastur deb taxmin qilinadi, chunki ko'pchilik asosiy ilovalar o'rnatish jarayonida dasturning bajariladigan faylini siz ko'rsatgan yo'lda joylashtiradi. Shunga o'xshash PATH muhit o'zgaruvchisi, sog'ligingiz uchun bahramand bo'ling!

eksport PATH=~/opt/bin:$PATH

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

9 Yechimlar “PATH ga yoʻlni qanday qilib toʻgʻri qoʻshish kerak?” uchun shakl veb-sahifasini toʻplaydi.

Oddiy narsalar

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

oxirida ~/opt/bin qo'shishni xohlaysizmi (bir nechta kataloglarda bir xil nomdagi dastur mavjud bo'lsa, boshqa barcha kataloglarni qidirish uchun) yoki boshida (barcha boshqa kataloglardan oldin qidirish uchun) bog'liq.

Bir vaqtning o'zida bir nechta yozuvlarni qo'shishingiz mumkin. PATH=$PATH:~/opt/bin:~/opt/node/bin yoki buyurtmadagi o'zgarishlar juda yaxshi.

Agar oʻzgaruvchi allaqachon muhitda boʻlsa, eksport qilishingiz shart emas: oʻzgaruvchi qiymatidagi har qanday oʻzgarish muhitda aks etadi.PATH deyarli har doim muhitda boʻladi; Hammasi unix tizimlari uni juda erta o'rnating (odatda birinchi jarayonda, aslida).

Agar sizning PATH turli komponentlarda qurilgan bo'lsa, siz takroriy yozuvlarga ega bo'lishingiz mumkin. Unix tomonidan aniqlanishi kerak bo'lgan manba katalogiga yo'lni qanday qo'shishni ko'ring, buyruq nima? va dublikatlarni qo'shmaslik yoki ularni o'chirishni oldini olish uchun awk buyrug'i yordamida ikki nusxadagi $PATH yozuvlarini olib tashlang.

Qayerga qo'yish kerak

E'tibor bering, ~/.bash_rc hech qanday dastur tomonidan o'qilmaydi va ~/.bashrc interaktiv bash misollari uchun konfiguratsiya faylidir. Siz ~/.bashrc da muhit o'zgaruvchilarini aniqlamasligingiz kerak. PATH kabi muhit oʻzgaruvchilarini aniqlash uchun toʻgʻri joy ~/.profile (yoki agar sizga bash boʻlmagan qobiqlar kerak boʻlmasa ~/.bash_profile). Qarang, ular orasidagi farq nima va qaysi birini ishlatishim kerak?

Bash bo'lmagan qobiqlar bo'yicha eslatmalar

Bash, ksh va zsh da eksport maxsus sintaksis bo'lib, PATH=~/opt/bin:$PATH va eksport PATH=~/opt/bin:$PATH ham hamma narsani to'g'ri bajaradi. Boshqa Bourne/POSIX qobiqlarida, masalan, chiziqcha (ko'p tizimlarda /bin/sh) eksport oddiy buyruq kabi tahlil qilinadi, bu ikkita farqni bildiradi:

  • ~ faqat so'z boshida tahlil qilinadi, topshiriqlardan tashqari ("Unix tomonidan aniqlanadigan manba katalogiga yo'lni qanday qo'shish kerak, qanday buyruq?" bo'limiga qarang).
  • $PATH qo'sh tirnoq tashqarisida bo'sh joy bo'lsa yoki \[*? ,

Shunday qilib, chiziqchaga o'xshash qobiqlarda eksport PATH=~/opt/bin:$PATH PATH ni ~/opt/bin/: so'ngra PATH qiymatini birinchi o'ringa qadar so'zma-so'z satriga o'rnatadi. PATH=~/opt/bin:$PATH (loyqa topshiriq) tirnoqlarni talab qilmaydi va to'g'ri ish qiladi. Agar siz portativ skriptda eksportdan foydalanmoqchi bo'lsangiz, eksport PATH="$HOME/opt/bin:$PATH" ni yozishingiz kerak.

¹ Bu Born raketalarida to'g'ri emas edi (haqiqiy Bourne qobig'idagi kabi, zamonaviy POSIX uslubidagi qobiqlarda emas), lekin siz hozirgi kunlarda eski qobiqlarni uchratishingiz dargumon.

Bu baribir ishlaydi, lekin ular bir xil ishni qilmaydi: PATH elementlari chapdan o'ngga tekshiriladi. Birinchi misolda bajariladigan fayllar~/opt/bin ichida, masalan, /usr/bin da o'rnatilganlardan ustun bo'ladi, bu siz xohlagan yoki bo'lmasligi mumkin.

Ayniqsa, xavfsizlik nuqtai nazaridan, old tomonga yoʻl qoʻshish xavflidir, chunki agar kimdir sizning ~/opt/bin ga yozish huquqiga ega boʻlsa, ular, masalan, / oʻrniga siz ishlatadigan boshqa ls-ni joylashtirishi mumkin. bin/ls sezmasdan Endi ssh yoki brauzeringiz yoki tanlovingiz bilan bir xil narsani tasavvur qiling... (Sizning yo'lingizda xuddi shunday ishni uch marta bajarish mumkin.)

Men 2-savol bilan chalkashib ketdim (chunki u savoldan olib tashlangan, chunki u bog'liq bo'lmagan masala bilan bog'liq edi):

Nima samarali usul turli qatorlarga qo'shimcha yo'llar qo'shiladimi? Dastlab, bu hiyla-nayrang bo'lishi mumkin deb o'yladim:

Eksport PATH=$PATH:~/opt/bin eksport PATH=$PATH:~/opt/node/bin

lekin bu emas, chunki ikkinchi topshiriq nafaqat ~/opt/node/bin ni, balki ilgari tayinlangan barcha PATH ni ham qo'shadi.

Bu mumkin bo'lgan yechim:

Eksport qilish PATH=$PATH:~/opt/bin:~/opt/node/bin

lekin o'qish uchun men har bir yo'lda bitta manzilga ega bo'lishni afzal ko'raman.

Aytsangiz

PATH=~/opt/bin

Bu Hammasi, sizning PATHingizda nima bo'ladi. PATH shunchaki muhit oʻzgaruvchisidir va agar siz PATHga qoʻshmoqchi boʻlsangiz, oʻzgaruvchini aynan oʻzingiz xohlagan tarkib bilan qayta qurishingiz kerak. Demak, siz 2-savolda misol qilib keltirgan narsa, agar men savolning mohiyatini to'liq o'tkazib yubormasam, aynan siz nima qilmoqchisiz.

Kodimda ikkala shakldan foydalanaman. Men ishlayotgan har bir kompyuterga o'rnatadigan umumiy profilim bor, u potentsial etishmayotgan kataloglarni joylashtirish uchun shunday ko'rinadi:

Eksport qilish PATH=/opt/bin:/usr/local/bin:/usr/contrib/bin:/bin:/usr/bin:/usr/sbin:/usr/bin/X11 # bindir yoʻliga ixtiyoriy elementlar qoʻshing $HOME/local/bin $HOME/bin ichida; do if [ -d $bindir ]; keyin PATH=$PATH:$(bindir) fi bajarildi

Linux $PATH muhitidan bajariladigan qidiruv yo'lini aniqlaydi. $PATH muhitining yuqori qismiga /data/myscripts katalogini qo'shish uchun quyidagilardan foydalaning:

PATH=/data/myscripts:$PATH

Ushbu katalogni yo'lning oxiriga qo'shish uchun quyidagi buyruqdan foydalaning:

PATH=$PATH:/data/myscripts

Ammo avvalgilari etarli emas, chunki skript ichida muhit o'zgaruvchisini o'rnatganingizda, bu o'zgarish faqat skript ichida kuchga kiradi. Ushbu cheklov faqat ikki yo'l bilan cheklangan:

  • Agar siz muhit o'zgaruvchisini skriptda eksport qilsangiz, u skript tomonidan chaqirilgan barcha dasturlarda samarali bo'ladi. E'tibor bering, bu skript deb nomlangan dasturda samarali emas.
  • Agar skriptni chaqiruvchi dastur buni qo'ng'iroq qilish o'rniga qo'shish orqali qilsa, skriptdagi har qanday muhit o'zgarishlari chaqiruvchi dasturda samarali bo'ladi. Ushbu inklyuziya nuqta buyrug'i yoki manba buyrug'i yordamida amalga oshirilishi mumkin.

$HOME/myscript.sh manbasi $HOME/myscript.sh

Inklyuziya asosan "qo'ng'iroq" skriptidagi "chaqiriladigan" skriptni o'z ichiga oladi. Bu C dagi #include ga o'xshaydi. Shuning uchun u skript yoki chaqiruv dasturi ichida samarali bo'ladi. Lekin, albatta, bu chaqiruvchi dastur tomonidan chaqirilgan har qanday dastur yoki skriptlar uchun samarali emas. Uni qo'ng'iroqlar zanjirigacha samarali qilish uchun eksport buyrug'i yordamida muhit o'zgaruvchisi sozlamalariga amal qilishingiz kerak.

Misol tariqasida, bash shell dasturi .bash_profile faylining tarkibini qo'shish orqali o'z ichiga oladi. Shunday qilib, .bash_profile ga quyidagi 2 qatorni qo'shing:

PATH=$PATH:/data/myscripts eksport PATH

ushbu 2 qator kodni bash dasturiga samarali joylashtiradi. Shunday qilib, in bash o'zgaruvchisi$PATH $HOME/myscript.sh ni o'z ichiga oladi va eksport bayonoti tufayli bash tomonidan chaqirilgan har qanday dasturlarda $PATH o'zgartiriladi. Va bash so'rovidan ishga tushirilgan har qanday dastur bash tomonidan chaqirilganligi sababli, yangi yo'l bash so'rovidan ishga tushirilgan har qanday narsa uchun amal qiladi.

Xulosa shuki, yo'lga yangi katalog qo'shish uchun siz qobiq tarkibiga kiritilgan skriptdagi $PATH muhit o'zgaruvchisiga katalogni qo'shishingiz yoki qo'shishingiz kerak va siz $PATH muhit o'zgaruvchisini eksport qilishingiz kerak.

qo'shimcha ma'lumot Bu yerga

Bir muncha vaqt davomida men o'zim bilan birga ikkita pathadd va pathrm funksiyalarini saqladim, ular takrorlanishlar haqida tashvishlanmasdan yo'lga elementlar qo'shishga yordam beradi.

pathadd bitta yo'l argumentini va argumentdan keyin ixtiyoriy oladi, agar qo'shilsa, PATHga qo'shiladi, aks holda uni qo'shadi.

Deyarli har qanday holatda, agar siz yo'l qo'shsangiz, ehtimol yo'lda bo'lgan hamma narsani bekor qilishni xohlaysiz, shuning uchun men sukut bo'yicha qo'shishni afzal ko'raman.

Pathadd() ( newelement=$(1%/) agar [ -d "$1" ] && ! echo $PATH | grep -E -q "(^|:)$newelement($|:)" ; agar [ " $2" = "keyin" ] ; keyin PATH="$PATH:$newelement" boshqa PATH="$newelement:$PATH" fi fi ) pathrm() ( PATH="$(echo $PATH | sed -e "s; \(^\|:\)$(1%/)\(:\|\$\);\1\2;g" -e "s;^:\|:$;;g" -e "s ;::;:;g")" )

PATH muhitini o'zgartirmoqchi bo'lgan har qanday skriptga ularni joylashtiring va endi buni qilishingiz mumkin.

PATH eksportidan keyin "/foo/bar" yo'li "/baz/bat" qo'shiladi

Agar u allaqachon mavjud bo'lsa, unga qo'shilmasligingiz kafolatlanadi. Agar siz hozir /baz/bat ishga tushishini istasangiz.

Pathrm "/baz/bat" pathadd "/baz/bat" eksport PATH

Har qanday yo'lni endi old tomonga olib kelish mumkin, agar u allaqachon ikki barobar bo'lmasdan yo'lda bo'lsa.

Boshqa distributivlar haqida gapira olmayman, lekin Ubuntuda barcha foydalanuvchilar uchun standart qidiruv yoʻli boʻlgan /etc/environment fayli mavjud. Mening kompyuterim faqat men tomonidan ishlatilganligi sababli, skriptga vaqtinchalik qo'shimcha bo'lsa, men xohlagan kataloglarni yo'limga qo'yaman.

Mana mening yechimim:

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

Chiroyli yorug'lik layneri orqada qolmaydi:

Men uchun (Mac OS X 10.9.5 da) /etc/paths fayliga yo'l nomini (masalan, /mypathname) qo'shish juda yaxshi ishladi.

Tahrirlashdan oldin echo $PATH qaytariladi:

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

/etc/paths-ni tahrirlash va qobiqni qayta ishga tushirgandan so'ng, $PATH o'zgaruvchisi /pathname bilan qo'shiladi. Haqiqatan ham, echo $PATH qaytaradi:

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

Nima sodir bo'ldi, /mypathname $PATH ga qo'shildi.

PATH muhiti PATHga yangi yoʻl qoʻshish uchun:

Eksport qilish PATH=$PATH:/new-path/

Ushbu o'zgarish siz ochgan har bir qobiqqa tegishli bo'lishi uchun uni siz qo'ng'iroq qilganingizda qobiq chaqiradigan faylga qo'shing. Turli xil qobiqlarda bu bo'lishi mumkin:

  • Bash Shell: ~/.bash_profile, ~/.bashrc yoki profil
  • Korn Shell: ~/.kshrc yoki .profile
  • Z Shell: ~/.zshrc yoki .zprofile

Masalan

# eksport PATH=$PATH:/root/learning/bin/ # source ~/.bashrc # echo $PATH

Yuqoridagi chiqishda taqdim etilgan yo'lni ko'rishingiz mumkin.

Linux-dagi barcha fayllar fayl tizimida ma'lum bir manzilga ega bo'lib, biz ularga fayl menejeri yoki konsol yordam dasturlari yordamida kirishimiz mumkin. Bu juda oddiy mavzu, lekin ko'plab yangi boshlanuvchilar u bilan qiyinchiliklarga duch kelishadi.

Bugungi qisqa maqolada biz Linux fayliga yo'l nima ekanligini, u nima bo'lishi mumkinligini, uni qanday to'g'ri yozishni va boshqa ko'p narsalarni ko'rib chiqamiz. Agar siz ilgari bu bilan qiyinchiliklarga duch kelgan bo'lsangiz, maqolani o'qib bo'lgach, hamma narsa aniq bo'ladi.

Linuxda fayl yo'llari

Linux fayl tizimi Windowsdan juda farq qiladi. Biz uning tuzilishini ko'rib chiqmaymiz, bu avvalroq qilingan. Biz fayllar bilan ishlashga e'tibor qaratamiz.

Eng muhim farq shundaki, fayl manzili drayvdan, masalan, C:\ yoki D:\ Windows-da bo'lgani kabi emas, balki ildiz tizimidan, barcha boshqalari ulangan ildiz tizimi katalogidan boshlanadi. Uning manzili - /. Va bu erda biz manzillar haqida gapirishimiz kerak. Linux fayl yo'llari manzildagi kataloglarni ajratish uchun "/" chiziq chizig'idan foydalanadi va bu Windows-da ko'rganingizdan farq qiladi - \.

Masalan, agar ichida Windows to'la ish stolidagi faylga yo'l C:\Users\Sergiy\Desktop\ kabi ko'rinardi, keyin Linuxda fayl yo'li oddiygina /home/sergiy/desktop/ bo'ladi. Bu bilan hozirgacha hamma narsa oddiy va tushunarli. Ammo muammolar yanada kuchayadi.

Linux operatsion tizimida bir necha turdagi fayl yo'llari bo'lishi mumkin. Keling, Linuxda qanday yo'llar borligini ko'rib chiqaylik:

  • Fayl tizimining ildizidan to'liq, mutlaq Linux yo'li- yuqoridagi misolda siz ushbu yo'lni allaqachon ko'rgansiz, u "/" ildizidan boshlanadi va faylga butun yo'lni tavsiflaydi;
  • Linux nisbiy yo'li- bu joriy papkaga nisbatan faylga yo'l; bunday yo'llar ko'pincha chalkashlikka olib keladi.
  • Joriy foydalanuvchining bosh papkasiga nisbatan yoʻl.- fayl tizimidagi yo'l, lekin ildizdan emas, balki joriy foydalanuvchi papkasidan.

Keling, ushbu yo'llar Linuxda qanday ko'rinishini batafsil ko'rib chiqaylik va buni to'liq aniq qilish uchun bir nechta misollarni ko'rib chiqaylik. Namoyish uchun biz kataloglar mazmunini ko'rish uchun mo'ljallangan ls yordam dasturidan foydalanamiz.

Misol uchun, bizning uy papkamizda to'rtta faylga ega bo'lgan shunday katalog mavjud:

Fayllardan biriga to'liq Linux yo'li shunday ko'rinadi:

ls /home/sergiy/tmp/file1

Bu allaqachon nisbiy Linux yo'li bo'lib, u uy papkasidan boshlanadi, u ~/ bilan belgilanadi. Eslatma, ~ emas, ya'ni ~/. Keyin pastki papkalarni belgilashingiz mumkin, bizning holatlarimizda tmp:

Xo'sh, yoki joriy jildga nisbatan Linuxdagi fayl yo'li:

Birinchi havola joriy jildga (.), ikkinchi (..) yuqoriroq jildga ishora qiladi. Bu kataloglarni navigatsiya qilish uchun yanada keng imkoniyatlar ochadi. Masalan, joriy jilddagi faylga murojaat qilish uchun quyidagi konstruksiyadan foydalanishingiz mumkin:

Bu fayl mazmunini ko'rishda foyda keltirmaydi. Lekin dasturni bajarishda bu juda muhim. Chunki dastur avval PATH muhitida, keyin esa shu papkada qidiriladi. Shuning uchun, agar siz joriy papkada joylashgan dasturni ishga tushirishingiz kerak bo'lsa va u /bin katalogidagi dastur bilan bir xil deb ataladigan bo'lsa, unda siz joriy papkada faylni izlashingiz kerak bo'lgan aniq havolasiz, hech narsa ishlamaydi.

Bunday konstruktsiyalar dasturlarni kompilyatsiya qilishda juda tez-tez sodir bo'lishi mumkin. Ushbu belgilarning barchasi va Linux fayl yo'llaridan nafaqat terminalda, balki har qandayida ham foydalanishingiz mumkin fayl menejeri, bu juda qulay bo'lishi mumkin.

Lekin Linux terminali yanada keng imkoniyatlar yaratadi. Siz oddiy joker belgilarni bevosita fayl yoki katalog manzillarida ishlatishingiz mumkin. Masalan, f bilan boshlangan barcha fayllarni ro'yxatlashingiz mumkin:

Yoki siz nafaqat tmp papkasida, balki uy papkangizning istalgan pastki papkasida ham qidirishingiz mumkin:

Va bularning barchasi ishlaydi, ehtimol bu har doim ham zarur va amaliy emas. Ammo ba'zi hollarda bu juda ko'p yordam berishi mumkin. Ushbu funktsiyalar Bash qobig'i darajasida amalga oshiriladi, shuning uchun ularni istalgan buyruqda ishlatishingiz mumkin. Qobiq qancha fayl topilganiga qaraydi va ularning har biri uchun buyruq chaqiradi.

xulosalar

Ana xolos. Endi siz nafaqat yo'lni to'g'ri yozishingiz kerak bo'lgan hamma narsani bilasiz linux fayli, balki fayllarni qidirish yoki cd buyrug'i yordamida kataloglar bo'ylab harakatlanish kabi murakkabroq amallarni ham bajaring. Agar sizda biron bir savol bo'lsa, sharhlarda so'rang!

Tegishli xabarlar:


Yangi yo'lni PATH muhit o'zgaruvchisiga qaerga qo'shish kerakligi qiziq. Men buni .bashrc tahrirlash orqali amalga oshirish mumkinligini bilaman (masalan,), lekin buni qanday qilish aniq emas.

Shunday qilib:

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

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

11 javob

Oddiy material

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

~/opt/bin kodini oxiriga (bir nechta kataloglarda bir xil nomdagi dastur mavjud bo'lsa, boshqa barcha kataloglarni qidirish uchun) yoki boshiga (barcha boshqa kataloglardan oldin qidirish uchun) qo'shishni xohlayotganingizga qarab.

Bir vaqtning o'zida bir nechta yozuvlarni qo'shishingiz mumkin. PATH=$PATH:~/opt/bin:~/opt/node/bin yoki buyurtmadagi o'zgarishlar juda yaxshi.

Agar oʻzgaruvchi allaqachon muhitda boʻlsa, eksport qilishingiz shart emas: oʻzgaruvchi qiymatidagi har qanday oʻzgarish muhitda aks etadi.¹ PATH deyarli har doim muhitda boʻladi; barcha unix tizimlari uni juda erta o'rnatadi (odatda birinchi jarayonda, aslida).

Agar PATH ko'plab turli komponentlar tomonidan yaratilgan bo'lsa, siz takroriy yozuvlarga ega bo'lishingiz mumkin. Unix tomonidan aniqlanadigan asosiy katalogga yo'lni qanday qo'shish mumkin, qaysi buyruq? va dublikatlarni oldini olish yoki ularni olib tashlash uchun awk buyrug'i yordamida ikki nusxadagi $PATH yozuvlarini olib tashlang.

Qayerga qo'yish kerak

Shuni unutmangki, ~/.bash_rc hech qanday dastur tomonidan o'qilmaydi va ~/.bashrc interaktiv bash misollari uchun konfiguratsiya faylidir. Siz ~/.bashrc da muhit o'zgaruvchilarini aniqlamasligingiz kerak. PATH kabi muhit oʻzgaruvchilarini aniqlash uchun toʻgʻri joy ~/.profile (yoki bashdan boshqa qobiqlarni yoqtirmasangiz ~/.bash_profile). Qarang, ular orasidagi farq nima va qaysi birini ishlatishim kerak?

Bash bo'lmagan qobiqlar bo'yicha eslatmalar

Bash, ksh va zsh da eksport maxsus sintaksis bo'lib, PATH=~/opt/bin:$PATH ham, eksport PATH=~/opt/bin:$PATH ham to'g'ri ish qiladi. Boshqa Bourne/POSIX qobiqlarida, masalan, chiziqcha (ko'p tizimlarda /bin/sh) eksport oddiy buyruq kabi tahlil qilinadi, bu ikkita farqni bildiradi:

  • ~ faqat so'z boshida tahlil qilinadi, topshiriqlar bundan mustasno (buyruqni talab qiladigan Unix tomonidan aniqlanadigan uy katalogi yo'lini qanday qo'shishimga qarang? ;
  • $PATH tashqi qo'sh tirnoq PATH bo'sh joy bo'lsa yoki \[*? .

Shunday qilib, tire kabi qobiqlarda eksport PATH=~/opt/bin:$PATH PATH qiymatini ~/opt/bin/: so‘ng birinchi o‘ringa qadar PATH qiymatini so‘zma-so‘z satriga o‘rnatadi. PATH=~/opt/bin:$PATH (oddiy topshiriq) tirnoqlarni talab qilmaydi va hamma narsani to'g'ri bajaradi. Agar siz portativ skriptda eksportdan foydalanmoqchi bo'lsangiz, eksport PATH="$HOME/opt/bin:$PATH" yoki PATH=~/opt/bin:$PATH eksport PATH (yoki PATH=$HOME/opt) yozishingiz kerak. /bin: $PATH eksport PATH, hatto Bourne qobig'iga ham ko'chirish uchun, u var=value eksportini qabul qilmaydi va tilde kengaytmasini amalga oshirmaydi).

¹ Bu Bourne qobiqlarida to'g'ri emas edi (haqiqiy Bourne qobig'ida bo'lgani kabi, zamonaviy POSIX uslubidagi qobiqlarda emas), lekin siz hozirgi kunlarda eski qobiqlarni uchratishingiz dargumon. Sub>

Ikkala usul ham ishlaydi, lekin ular bir xil ishni qilmaydi: PATH elementlari chapdan o'ngga qarab tekshiriladi. Birinchi misolda, ~/opt/bin-dagi bajariladigan fayllar, masalan, /usr/bin ichida o'rnatilganlardan ustun bo'ladi, bu siz xohlagan yoki bo'lmasligi mumkin.

Xususan, xavfsizlik nuqtai nazaridan old tomonga yoʻl qoʻshish xavflidir, chunki agar kimdir sizning ~/opt/bin ga yozish huquqiga ega boʻlsa, ular boshqa ls ni qoʻyishi mumkin, siz uni oʻrniga /bin/ls ishlatishingiz mumkin. sezmasdan. Endi ssh yoki brauzeringiz yoki tanlovingiz uchun ham xuddi shunday tasavvur qiling... (Yo'lingizga bir xil narsa uch marta qo'yilgan.)

Men 2-savolda chalkashib ketdim (chunki u savoldan olib tashlangan, chunki u emas bog'liq muammo):

Turli qatorlarga qo'shimcha yo'llarni qo'shishning samarali usuli qanday? Dastlab, bu hiyla-nayrang bo'lishi mumkin deb o'yladim:

Eksport PATH=$PATH:~/opt/bin eksport PATH=$PATH:~/opt/node/bin

Lekin bu ikkinchi topshiriq nafaqat ~/opt/node/bin ni, balki oldindan tayinlangan PATH ni ham qo'shgani uchun emas.

Bu mumkin bo'lgan vaqtinchalik yechim:

Eksport qilish PATH=$PATH:~/opt/bin:~/opt/node/bin

Lekin o'qish uchun men har bir yo'lda bitta manzilga ega bo'lishni afzal ko'raman.

Aytsangiz

PATH=~/opt/bin

Bu hammasi, bu sizning PATHingizda bo'ladi. PATH shunchaki muhit oʻzgaruvchisidir va agar siz PATHga qoʻshmoqchi boʻlsangiz, oʻzgaruvchini aynan oʻzingiz xohlagan tarkib bilan qayta qurishingiz kerak. Ya'ni, 2-savolda misol qilib keltirgan narsangiz, agar men savolning mazmunini butunlay o'tkazib yuborgan bo'lsam, aynan siz nima qilmoqchisiz.

Kodimda ikkala shakldan foydalanaman. Menda potentsial etishmayotgan kataloglarni joylashtirish uchun men ishlayotgan har bir mashinaga o'rnatadigan umumiy profilim bor:

Eksport qilish PATH=/opt/bin:/usr/local/bin:/usr/contrib/bin:/bin:/usr/bin:/usr/sbin:/usr/bin/X11 # bindir yoʻliga ixtiyoriy elementlar qoʻshing $HOME/local/bin $HOME/bin ichida; do if [ -d $bindir ]; keyin PATH=$PATH:$(bindir) fi bajarildi

Linux bajariladigan qidiruv yo'lini $PATH muhit o'zgaruvchisi bilan belgilaydi. $PATH muhit oʻzgaruvchisining boshiga /data/myscripts katalogini qoʻshish uchun quyidagilardan foydalaning:

PATH=/data/myscripts:$PATH

Ushbu katalogni yo'lning oxiriga qo'shish uchun quyidagi buyruqdan foydalaning:

PATH=$PATH:/data/myscripts

Ammo avvalgilari etarli emas, chunki skript ichida muhit o'zgaruvchisini o'rnatganingizda, bu o'zgarish faqat skript ichida kuchga kiradi. Ushbu cheklov ikki yo'l bilan cheklangan:

  • Agar siz muhit o'zgaruvchisini skript ichida eksport qilsangiz, u skript tomonidan chaqirilgan har qanday dasturlarda samarali bo'ladi. E'tibor bering, bu skriptni chaqirgan dasturda samarali emas.
  • Agar skriptni chaqiruvchi dastur buni qo'ng'iroq qilish o'rniga qo'shish orqali qilsa, skriptdagi har qanday muhit o'zgarishlari chaqiruvchi dasturda samarali bo'ladi. Ushbu inklyuziya nuqta buyrug'i yoki manba buyrug'i yordamida amalga oshirilishi mumkin.

$HOME/myscript.sh manbasi $HOME/myscript.sh

Inklyuziya asosan "qo'ng'iroq" skriptidagi "chaqiriladigan" skriptni o'z ichiga oladi. Bu C dagi #include ga o'xshaydi. Shuning uchun u skript yoki chaqiruv dasturi ichida samarali bo'ladi. Lekin, albatta, bu chaqiruvchi dastur tomonidan chaqirilgan har qanday dastur yoki skriptlar uchun samarali emas. Uni qo'ng'iroqlar zanjirigacha samarali qilish uchun eksport buyrug'i yordamida muhit o'zgaruvchisi sozlamalariga amal qilishingiz kerak.

Misol tariqasida, bash shell dasturi .bash_profile faylining tarkibini qo'shish orqali o'z ichiga oladi. Shunday qilib, .bash_profile-ga quyidagi 2 qatorni qo'ying:

PATH=$PATH:/data/myscripts eksport PATH

ushbu 2 qator kodni bash dasturiga samarali joylashtiradi. Shunday qilib, bash'da $PATH o'zgaruvchisi $HOME/myscript.sh ni o'z ichiga oladi va eksport bayonoti tufayli bash tomonidan chaqirilgan har qanday dasturlarda $PATH o'zgaruvchisi o'zgartiriladi. Va bash so'rovidan ishga tushiradigan har qanday dasturlar bash tomonidan chaqirilganligi sababli, yangi yo'l siz bash so'rovidan ishga tushirgan har qanday narsaga tegishli.

Xulosa shuki, yo'lga yangi katalog qo'shish uchun siz qobiq tarkibiga kiritilgan skriptdagi $PATH muhit o'zgaruvchisiga katalogni qo'shishingiz yoki qo'shishingiz kerak va siz $PATH muhit o'zgaruvchisini eksport qilishingiz kerak.

Men bir muncha vaqt o'zim bilan birga ikkita funktsiyani ushlab turdim pathadd va pathrm, ular takrorlanishlar haqida qayg'urmasdan yo'lga elementlar qo'shishga yordam beradi.

pathadd bitta yo'l argumentini va argumentdan keyin ixtiyoriyni oladi, agar qo'shilsa PATH ga qo'shiladi, aks holda uni qo'shadi.

Har qanday vaziyatda, agar siz yo'l qo'shayotgan bo'lsangiz, ehtimol yo'lda bo'lgan har qanday narsani bekor qilishni xohlaysiz, shuning uchun men sukut bo'yicha qo'shishni afzal ko'raman.

Pathadd() ( newelement=$(1%/) agar [ -d "$1" ] && ! echo $PATH | grep -E -q "(^|:)$newelement($|:)" ; agar [ " $2" = "keyin" ] ; keyin PATH="$PATH:$newelement" boshqa PATH="$newelement:$PATH" fi fi ) pathrm() ( PATH="$(echo $PATH | sed -e "s; \(^\|:\)$(1%/)\(:\|\$\);\1\2;g" -e "s;^:\|:$;;g" -e "s ;::;:;g")" )

PATH muhitini o'zgartirmoqchi bo'lgan har qanday skriptga ularni joylashtiring va endi ish tugadi.

PATH eksportidan keyin "/foo/bar" yo'li "/baz/bat" qo'shiladi

Agar u allaqachon mavjud bo'lsa, sizga yo'l qo'shmaslik kafolatlanadi. Agar /baz/bat birinchi bo'lib ishga tushishini istasangiz.

Pathrm "/baz/bat" pathadd "/baz/bat" eksport PATH

Har qanday yo'l endi oldingi tomonga ko'chirilishi mumkin, agar u allaqachon ikki barobar bo'lmasdan yo'lda bo'lsa.

O'q o'tkazmaydigan qo'shish / oldindan tayyorlash usuli

Qo'shish va qo'shishni tanlashda ko'plab fikrlar mavjud. Ularning ko'pchiligi boshqa javoblarda yoritilgan, shuning uchun men ularni bu erda takrorlamayman.

Muhim nuqta shundaki, tizim skriptlari buni ishlatmasa ham (nima uchun deb o'ylayman) *1, bu PATH muhit o'zgaruvchisiga yo'lni (masalan, $HOME/bin) qo'shishning o'q o'tkazmaydigan usulidir.

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

qo'shish uchun (PATH="$PATH:$HOME/bin" o'rniga) va

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

qo'shish (PATH="$HOME/bin:$PATH" o'rniga)

Bu $PATH dastlab boʻsh boʻlganida notoʻgʻri yetakchi/oxirgi yoʻgʻon nuqta qoʻyishdan saqlaydi, bu esa istalmagan yon taʼsirga olib kelishi mumkin va uni topish dahshatli tush boʻlishi mumkin (bu javob awk -way holatiga qisqacha murojaat qiladi).

$(parametr:+word)

Agar parametr null yoki o'rnatilmagan bo'lsa, hech narsa almashtirilmaydi, aks holda u almashtiriladi so'z so'z.

Shunday qilib, $(PATH:+$(PATH):) kengayadi: 1) PATH null yoki oʻrnatilmagan boʻlsa, hech narsa, 2) $(PATH): agar PATH oʻrnatilgan boʻlsa.

Eslatma. Bu bash uchun.

*1 Men devtoolset-6/enable kabi skriptlar buni ishlatishini aniqladim, $ cat /opt/rh/devtoolset-6/enable # Umumiy muhit oʻzgaruvchilari eksporti PATH=/opt/rh/devtoolset-6/root/usr /bin $(PATH:+:$(PATH)) ...

Boshqa distributivlar haqida gapira olmayman, lekin Ubuntuda barcha foydalanuvchilar uchun standart qidiruv yoʻli boʻlgan /etc/environment fayli bor. Mening kompyuterim faqat men tomonidan ishlatilganligi sababli, skriptga vaqtinchalik qo'shimcha bo'lmasa, men xohlagan kataloglarni yo'limga qo'yaman.

Men uchun (Mac OS X 10.9.5 da) /etc/paths fayliga yo'l nomini (masalan, /mypathname) qo'shish juda yaxshi ishladi.

Tahrirlashdan oldin echo $PATH qaytariladi:

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

/etc/paths-ni tahrirlash va qobiqni qayta ishga tushirgandan so'ng, $PATH o'zgaruvchisi /pathname bilan qo'shiladi. Haqiqatan ham, echo $PATH qaytaradi:

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

Nima sodir bo'ldi, $PATH o'zgaruvchisiga /mypathname qo'shildi.