Sto usando zsh
su Ubuntu e ho creato un collegamento simbolico per bat
così:
ln -s /usr/bin/batcat /home/user_name/.local/bin/bat
premendo ls -l
da ~/.local/bin
mostra:
lrwxrwxrwx 1 tux tux 15 May 19 13:47 bat -> /usr/bin/batcat
Ora da qualsiasi directory (anche in ~/.local/bin
),
Se eseguo bat
, ottengo command not found: bat
. Eseguendo anche ~/.local/bin
non funziona. Tuttavia, eseguendo ./bat
(da ~/.local/bin
) funziona. Esecuzione di batcat
funziona anche.
echo $PATH
mostra che ~/.local/bin
è nel percorso
Cosa potrebbe andare storto qui? nessun collegamento simbolico funziona, bat
è solo un esempio
PS In bash, le cose funzionano come previsto
Risposta accettata:
Se il tuo PATH
contiene effettivamente ~/.local/bin
con il carattere letterale della tilde:non funzionerà. La tilde deve essere espansa nella tua home directory.
Ad esempio, una di queste righe è corretta in zsh, bash o qualsiasi altra shell simile a sh:
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"
Funzionano perché ~
viene esteso alla home directory quando si trova all'inizio di una parola, subito dopo il segno di uguale in un'assegnazione o subito dopo un :
nella parte destra di un compito (lo scopo di quest'ultima regola è proprio per comodità di impostare PATH
).
Ma una riga come PATH="~/.local/bin:$PATH"
non funzionerà, perché ~
non è espanso tra virgolette, quindi il valore di PATH
finisce per contenere il carattere letterale ~
. Questo PATH
fa riferimento a una directory chiamata ~
nella directory corrente, non nella tua home directory.
Bash¹ ha una funzione in cui ~
viene interpretato come la directory home all'inizio delle voci di percorso. Quindi PATH="~/.local/bin:$PATH"
funziona parzialmente in bash. Tuttavia, funziona solo quando esegui un programma direttamente da bash, non quando programmi diversi da bash avviano programmi. Quindi, anche se usi bash, non inserire un ~
letterale nel percorso, assicurati che sia espanso o usa $HOME
invece.