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.
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. (…)
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