Muhit o'zgaruvchilari — PATH, export, .bashrc, alias
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 (bashISMni 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,cddan 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.gitignoreda 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'rishNOM=qiymat— bo'shliqsiz;export NOM=qiymat— dasturlarga uzatishPORT=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'llashalias qisqa='uzun buyruq'.env—set -a; source .env; set +a;chmod 600
Keyingi dars
31-dars: Arxivlar — tar, gzip, zip