Muhit o'zgaruvchilari — PATH, export, .bashrc, alias

~12 daq · Linux · Paketlar va muhit

Muammodan boshlaylik

Go yoki Rust ni o'rnatdingiz, qo'llanma bo'yicha. Terminalda:

go version
bash: go: command not found

Lekin dastur o'rnatilgan — /usr/local/go/bin/go fayli mavjud. Nega shell uni topmayapti? Va nega terminalni yopib ochganda qilgan sozlamalaringiz yo'qolib ketyapti?

Javob — muhit o'zgaruvchilari va xususan PATH.


Muhit o'zgaruvchilari

Muhit o'zgaruvchisi — nom = qiymat juftligi, har bir jarayon ota-onasidan meros oladi. Ular dasturlarga "muhit haqida" ma'lumot beradi.

echo $HOME
echo $USER
echo $SHELL
echo $PWD
/home/otabek
otabek
/bin/bash
/home/otabek/loyihalar

Barchasini ko'rish:

env
printenv | sort
printenv PATH

Muhim o'zgaruvchilar

O'zgaruvchi Nima
HOME Uy papka
USER Foydalanuvchi nomi
PATH Buyruqlar qidiriladigan papkalar
SHELL Standart shell
PWD Joriy papka
EDITOR Standart muharrir (12-dars)
LANG Til va kodlash
TZ Vaqt mintaqasi

O'zgaruvchi yaratish: shell va export

ISM="Otabek"              # shell o'zgaruvchisi — faqat shu shell da
echo $ISM

[!WARNING] = atrofida bo'shliq yo'q: ISM = "Otabek" — xato (bash ISM ni buyruq deb o'ylaydi).

Dasturlar bu o'zgaruvchini ko'rmaydi — u faqat shell ichida. Dasturlarga uzatish uchun — export:

export PORT=3000
node -e "console.log(process.env.PORT)"     # 3000

Faqat bitta buyruq uchun:

PORT=8080 node server.js
NODE_ENV=production npm run build

O'chirish:

unset PORT

PATH — buyruqlar qayerdan topiladi

ls yozganingizda, shell ls dasturini qayerdan topadi? PATH dagi papkalardan, tartib bilan:

echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/otabek/.local/bin

: bilan ajratilgan papkalar. Shell ularni chapdan o'ngga qidiradi va birinchi topilganini ishga tushiradi.

which ls          # /usr/bin/ls — PATH dagi qaysi papkada topildi
type -a python3   # barcha mos keluvchilar

PATH ga papka qo'shish

export PATH="$PATH:/usr/local/go/bin"
go version         # endi ishlaydi
  • $PATH — eski qiymat saqlanadi
  • :/usr/local/go/bin — oxiriga qo'shiladi

[!WARNING] export PATH="/usr/local/go/bin" ($PATH: siz) — eski qiymatni o'chiradi. Natija: ls, cd dan boshqa deyarli hech qanday buyruq ishlamaydi. Agar shunday bo'lsa — terminalni yopib qayta oching (o'zgarish faqat shu sessiyada edi).

Joriy papkadagi skript

deploy.sh          # command not found
./deploy.sh        # ✅

Joriy papka (.) PATH da yo'q — xavfsizlik uchun (aks holda kimdir papkaga ls nomli zararli skript qo'yishi mumkin). Shuning uchun ./ kerak.

O'z skriptlaringiz uchun shaxsiy papka:

mkdir -p ~/.local/bin
mv deploy.sh ~/.local/bin/deploy
chmod +x ~/.local/bin/deploy
deploy             # endi istalgan joydan

Ubuntu ~/.local/bin ni avtomatik PATH ga qo'shadi (u mavjud bo'lsa, qayta kirgandan keyin).


.bashrc — doimiy sozlamalar

export faqat joriy terminal sessiyasida ishlaydi. Terminalni yopsangiz — yo'qoladi. Doimiy qilish uchun — ~/.bashrc fayli: har bir yangi bash sessiyasi boshida avtomatik bajariladi.

nano ~/.bashrc

Oxiriga qo'shing:

# Mening sozlamalarim
export EDITOR=nano
export PATH="$PATH:/usr/local/go/bin:$HOME/.local/bin"

Joriy sessiyada qo'llash (terminalni qayta ochmasdan):

source ~/.bashrc
Fayl Qachon o'qiladi
~/.bashrc Har bir interaktiv bash (yangi terminal oynasi)
~/.profile Tizimga kirishda (SSH login)
/etc/environment Butun tizim uchun, barcha foydalanuvchilar
~/.zshrc macOS va zsh foydalanuvchilari uchun

Ubuntu da ~/.profile o'zi ~/.bashrc ni chaqiradi — shuning uchun odatda faqat .bashrc yetarli.


alias — qisqa nomlar

alias ll='ls -alF'
alias gs='git status'
alias ..='cd ..'
alias dc='docker compose'
alias ports='sudo ss -tlnp'
alias update='sudo apt update && sudo apt upgrade -y'

Doimiy qilish — ~/.bashrc ga yozing. Ro'yxat: alias. O'chirish: unalias gs.

type ll         # ll is aliased to `ls -alF'

Xavfsizlik uchun foydali:

alias rm='rm -I'
alias cp='cp -i'
alias mv='mv -i'

Prompt ni o'zgartirish

Prompt — PS1 o'zgaruvchisida:

echo $PS1
export PS1='\u@\h:\w\$ '

\u foydalanuvchi, \h kompyuter, \w papka. Production serverda prompt ni qizil qilish — "ehtiyot bo'l, bu production" degan eslatma:

export PS1='\[\e[1;31m\][PROD] \u@\h:\w\$\[\e[0m\] '

Zamonaviy chiroyli prompt uchun — Starship (curl -sS https://starship.rs/install.sh | sh).


.env fayllar va ilovalar

Ilovalar sozlamalarni muhit o'zgaruvchilaridan o'qiydi (process.env.DATABASE_URL). Lokal ishlab chiqishda ular .env faylida saqlanadi:

# .env
PORT=3000
DATABASE_URL=mysql://dokon:parol@localhost/dokon

Shell ga yuklash:

set -a; source .env; set +a

set -a — keyingi barcha o'zgaruvchilarni avtomatik export qilish. Production da — systemd ning EnvironmentFile= (25-dars) yoki Docker ning env_file.

[!WARNING] .env — maxfiy: chmod 600 .env (20-dars) va .gitignore da bo'lsin.


Nima uchun shunday?

Nima uchun sozlamalar fayllarda emas, muhit o'zgaruvchilarida uzatiladi?

Chunki bu kod va konfiguratsiyani ajratadi. Bir xil dastur (bir xil fayl, bir xil Docker image) lokalda DATABASE_URL=localhost, test serverda — boshqa baza, production da — uchinchisi bilan ishlaydi; kodni o'zgartirmasdan. Muhit o'zgaruvchilari har qanday tilda, har qanday OS da bir xil ishlaydi va ota jarayondan bolaga avtomatik meros o'tadi — systemd, Docker, CI tizimlari hammasi ularni qo'llab-quvvatlaydi. Bu tamoyil "Twelve-Factor App" metodologiyasining asosiy qoidalaridan biri.


Xulosa

Eslab qoling:

  • echo $NOM, env, printenv — o'zgaruvchilarni ko'rish
  • NOM=qiymat — bo'shliqsiz; export NOM=qiymat — dasturlarga uzatish
  • PORT=8080 node app.js — faqat bitta buyruq uchun
  • PATH — buyruqlar qidiriladigan papkalar; qo'shish: export PATH="$PATH:/yangi/papka"
  • ./skript.sh — joriy papka PATH da yo'q
  • ~/.bashrc — doimiy sozlamalar; source ~/.bashrc — qo'llash
  • alias qisqa='uzun buyruq'
  • .env — set -a; source .env; set +a; chmod 600

Keyingi dars

31-dars: Arxivlar — tar, gzip, zip