estoy usando zsh
en ubuntu y creé un enlace simbólico para bat
así:
ln -s /usr/bin/batcat /home/user_name/.local/bin/bat
pulsando ls -l
de ~/.local/bin
muestra:
lrwxrwxrwx 1 tux tux 15 May 19 13:47 bat -> /usr/bin/batcat
Ahora desde cualquier directorio (incluso en ~/.local/bin
),
Si ejecuto bat
, obtengo command not found: bat
. También ejecutando ~/.local/bin
no funciona Sin embargo, ejecutar ./bat
(de ~/.local/bin
) funciona. Ejecutando batcat
también funciona.
echo $PATH
muestra que ~/.local/bin
está en el camino
¿Qué podría estar yendo mal aquí? ningún enlace simbólico funciona, bat
es solo un ejemplo
PD En bash, las cosas funcionan como se esperaba
Respuesta aceptada:
Si su PATH
en realidad contiene ~/.local/bin
con el carácter de tilde literal:eso no funcionará. La tilde debe expandirse a su directorio de inicio.
Por ejemplo, cualquiera de estas líneas es correcta en zsh, bash o cualquier otro shell similar 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"
Funcionan porque ~
se expande al directorio de inicio cuando está al comienzo de una palabra, inmediatamente después del signo igual en una tarea, o inmediatamente después de un :
en el lado derecho de una asignación (el propósito de esta última regla es precisamente la conveniencia de configurar PATH
).
Pero una línea como PATH="~/.local/bin:$PATH"
no funcionará, porque ~
no se expande entre comillas dobles, por lo que el valor de PATH
termina conteniendo el carácter literal ~
. Esta PATH
hace referencia a un directorio llamado ~
en el directorio actual, no en su directorio de inicio.
Bash¹ tiene una función en la que ~
se interpreta como el directorio de inicio al comienzo de las entradas de ruta. Entonces PATH="~/.local/bin:$PATH"
funciona parcialmente en bash. Sin embargo, solo funciona cuando ejecuta un programa desde bash directamente, no cuando otros programas que no sean bash inician programas. Entonces, incluso si usa bash, no ponga un ~
literal en la ruta, asegúrese de que esté expandida o use $HOME
en su lugar.