Dasturlash

Tilda belgisi PATHga kiritilmasligi kerak

11-oktabr, 2026, 18:031 ko'rish3 daqiqa o'qish
Tilda belgisi PATHga kiritilmasligi kerak

Tilda belgisi PATHga kiritilganda, u home yoʻlini kengaytirmaydi. Bu xatoni to'g'rilash va uni qanday oldini olish haqida ma'lumot.

Men nono agent sandboxing vositasidan foydalanayotganimda, quyidagi ogohlantirishni oldim: PATH kirishlari sandboxga yozish mumkin: ~/.local/bin/. Bu ogohlantirish shubhali ko'rinardi.

nono warning about PATH entries the sandbox can write to

Ya'ni, quyidagi kodni ~/.bashrc yoki ~/.zshrc fayllariga kiritish:

export PATH="$PATH:~/.local/bin/"

Tilda belgisini home yoʻliga kengaytirmaydi (yoki $HOME). Tilda belgisi faqat unquoted kirishlarda home yoʻliga kengaytiriladi, bash hujjatiga ko'ra:

Agar so'z unquoted tilda belgisi bilan boshlansa ('~'), tilda-prefix sifatida hisoblanadi. (…)

Bash har bir o'zgaruvchi belgilanishini unquoted tilda-prefixlar uchun tekshiradi va bu holatlarda tilda kengaytirishini amalga oshiradi. (…)

Demo showing that a literal tilde in PATH resolves to a ./~/ directory in the current working directory

Shuning uchun, /home/.local/bin/ PATHga qo'shilmasligi o'rniga, ./~/.local/bin/ PATHga qo'shiladi.

Bu xatoni to'g'rilash uchun quyidagi kodni ishlatish mumkin:

export PATH="$PATH:$HOME/.local/bin/"

Tilda belgisi unquoted versiyasi export PATH=$PATH:~/.local/bin bash va zsh-da ishlaydi, chunki tilda kengaytirish = va har bir : dan keyin amalga oshiriladi. Biroq, bu usul noaniqdir, chunki masalan, bo'sh joy o'zgaruvchi belgilanishini buzadi.

Bu muammo quyidagi misolda ham ko'rinadi:

export PATH="$PATH:~/.local/bin/"

$ ls -la

total 0

drwxr-xr-x@ 2 dc staff 64 Oct 2 13:37 .

drwxr-x---+ 105 dc staff 3360 Oct 2 13:37 ..

$ mkdir -p ./~/.local/bin/

export PATH="$PATH:$HOME/.local/bin/"

$ printf '#include int main() { puts("hello"); }'>a.c; gcc a.c -o ./~/.local/bin/kek

$ PATH="~/.local/bin/" kek

hello

$ tree -f

.

$ ls -la
total 0
drwxr-xr-x@   2 dc  staff    64 Oct  2 13:37 .
drwxr-x---+ 105 dc  staff  3360 Oct  2 13:37 ..
$ mkdir -p ./~/.local/bin/
$ printf '#include <stdio.h>\nint main() { puts("hello"); }'>a.c; gcc a.c -o ./~/.local/bin/kek
$ PATH="~/.local/bin/" kek
hello
$ tree -f
.
├── ./~
│   └── ./~/.local
│       └── ./~/.local/bin
│           └── ./~/.local/bin/kek
└── ./a.c

4 directories, 2 files

├── ./~

│ └── ./~/.local

│ └── ./~/.local/bin

│ └── ./~/.local/bin/kek

└── ./a.c

$ echo "$PATH" | grep -- '~'

4 directories, 2 files

Kek binary ./~/.local/bin/ dan topildi va ijro etildi — home yoʻlida hech qanday ishtirok yo'q edi.

PATHni tekshirish

Siz bu muammoga ega ekanligingizni tezda tekshirish uchun quyidagi komandani ishlatishingiz mumkin:

$ echo "$PATH" | grep -- '~'

$ echo "$PATH" | tr ':' '\n' | grep '~'
~/.local/bin/

Yoki, har bir kirishni alohida qatorda ko'rish uchun:

$ echo "$PATH" | tr ':' '\n' | grep '~'

Agar nima-dir chiqsa, .bashrc, .zshrc yoki .profile fayllarini to'g'rilash va tilda belgisini $HOME bilan almashtiring.

Btw, nono vositasiga bu ogohlantirish uchun tabriklar — hatto ogohlantirish biroz ko'proq ma'lumotli bo'lsa ham (PR keladi).

Asl manba: disconnect3d.pl

Manba: Hacker News
#bash #zsh #PATH #tilda belgisi #home yoʻli
Telegram da muhokama qilish