Saya menggunakan zsh
di ubuntu dan saya membuat symlink untuk bat
seperti ini:
ln -s /usr/bin/batcat /home/user_name/.local/bin/bat
menekan ls -l
dari ~/.local/bin
menunjukkan:
lrwxrwxrwx 1 tux tux 15 May 19 13:47 bat -> /usr/bin/batcat
Sekarang dari direktori manapun (bahkan di ~/.local/bin
),
Jika saya menjalankan bat
, saya mendapatkan command not found: bat
. Juga menjalankan ~/.local/bin
tidak bekerja. Namun, menjalankan ./bat
(dari ~/.local/bin
) bekerja. Menjalankan batcat
juga berfungsi.
echo $PATH
menunjukkan bahwa ~/.local/bin
ada di jalan
Apa yang bisa salah di sini? tidak ada symlink yang berfungsi, bat
hanyalah sebuah contoh
P.S. Di bash, semuanya berfungsi seperti yang diharapkan
Jawaban yang Diterima:
Jika PATH
. Anda sebenarnya berisi ~/.local/bin
dengan karakter tilde literal:itu tidak akan berhasil. Tilde perlu diperluas ke direktori home Anda.
Misalnya, salah satu dari baris ini benar di zsh, bash, atau shell mirip sh lainnya:
PATH=~/.local/bin:$PATH
PATH=$PATH:~/.local/bin
PATH=~/.local/bin:"$PATH"
PATH="$PATH":~/.local/bin
export PATH="$HOME/.local/bin:$PATH"
export PATH="$PATH:$HOME/.local/bin"
Mereka bekerja karena ~
diperluas ke direktori home saat berada di awal kata, tepat setelah tanda sama dengan dalam tugas, atau segera setelah :
di sisi kanan tugas (tujuan aturan terakhir ini justru untuk kenyamanan pengaturan PATH
).
Tapi baris seperti PATH="~/.local/bin:$PATH"
tidak akan berfungsi, karena ~
tidak diperluas dalam tanda kutip ganda, jadi nilai PATH
akhirnya mengandung karakter literal ~
. PATH
ini mereferensikan direktori bernama ~
di direktori saat ini, bukan direktori home Anda.
Bash¹ memiliki fitur di mana ~
ditafsirkan sebagai direktori home di awal entri jalur. Jadi PATH="~/.local/bin:$PATH"
sebagian berfungsi di bash. Namun, ini hanya berfungsi saat Anda menjalankan program dari bash secara langsung, bukan saat program selain bash sendiri yang memulai program. Jadi, meskipun Anda menggunakan bash, jangan tulis ~
. secara literal di jalur, pastikan itu diperluas atau gunakan $HOME
sebagai gantinya.