macos - rutas - Agregue una ruta relativa a $ PATH en el inicio de pez
url relativos y absolutos (5)
Creo que la respuesta es que usar set -U
es una pista falsa. En su lugar, agregue lo siguiente a ~/.config/fish/config.fish
:
if status --is-interactive
set PATH $PATH ~/.local/bin;
end
Quiero agregar el directorio ./bin (que es relativo al directorio de shell actual) a $ PATH en el inicio del pez. Tenga en cuenta que el fish
es un caparazón.
echo $PATH
set PATH ./bin $PATH
echo $PATH
Si ~/.config/fish/config.fish
estas líneas dentro de ~/.config/fish/config.fish
el shell hará eco de la misma colección de rutas. Los caminos absolutos se agregan correctamente.
Si abro el intérprete de comandos y set PATH ./bin $PATH
el mismo set PATH ./bin $PATH
dentro de un directorio que contiene el bin
, se agrega con éxito. Sin embargo, cuando no hay ningún bin
dentro del directorio actual, me muestra un error.
set: Could not add component ./bin to PATH.
set: Value too large to be stored in data type
Estoy ejecutando Fish 1.23.1 en OS X Lion.
La mejor forma que he encontrado para agregar persistentemente una ruta a tu $PATH
es
set -U fish_user_paths $fish_user_paths ~/path/name
Esto depende de $PATH
. Y dado que es persistente, la ruta permanece en $PATH
en reinicios del shell.
Es más eficiente que poner un comando en su config.fish
para modificar su $PATH
, porque solo se ejecuta una vez en comparación con la ejecución de cada reinicio de shell.
La variable fish_user_paths
está destinada a ser configurada por el usuario 1 , como lo establece ridiculousfish , el mantenedor de pescado.
Considere crear una función de pez para mayor comodidad: 2
# ~/.config/fish/functions/add_to_path.fish
function add_to_path --description ''Persistently prepends paths to your PATH''
set --universal fish_user_paths $fish_user_paths $argv
end
Y úsalo como:
$ add_to_path foo bar # Adds foo/ and bar/ to your PATH
Notas
En esa página, el autor da el ejemplo
set -U fish_user_paths ~/bin
. Esto sobrescribefish_user_paths
con un valor único de~/bin
. Para evitar la pérdida de rutas de acceso establecidas enfish_user_paths
, asegúrese de incluir$fish_user_paths
además de las nuevas rutas que se agreguen (como se ve en mi respuesta).Mis archivos dotfiles contienen una versión ligeramente más avanzada que omite agregar duplicados https://github.com/dideler/dotfiles/blob/master/.config/fish/functions/add_to_user_path.fish
Nunca había oído hablar de fish
antes de esto. Acabo de instalarlo para poder probarlo (y borré algunos párrafos que había escrito aquí antes de darme cuenta de que el fish
es un caparazón).
Parece que el set PATH dir-name $PATH
es la sintaxis correcta para anteponer un directorio a $PATH
.
Pero agregar un nombre de directorio relativo a $PATH
es casi seguro que es una mala idea, y su shell le está haciendo un favor advirtiéndole cuando el directorio no existe. (El fish
está diseñado para ser fácil de usar.)
Use una ruta absoluta en su lugar:
set PATH $PWD/bin $PATH
y primero compruebe si existe $PWD/bin
, imprimiendo un mensaje de error si no lo hace.
En cuanto al mensaje " set: Value too large to be stored in data type
", ¿podría agregar el directorio a su $PATH
varias veces? Debería haber alguna manera de verificar si un directorio ya está en $PATH
antes de agregarlo.
Parece que fish
no agregará una ruta de directorio no existente a PATH. Eso también se aplica a las rutas relativas. Pero si crea el directorio bin
en su directorio home, set PATH ./bin $PATH
funcionará correctamente en cada inicio dado que se ejecuta desde su hogar. Esto es una especie de truco.
direnv http://direnv.net/ es una buena herramienta para ayudar con lo que estás haciendo.
En general, anteponer $ PATH con ./bin es inseguro, ya que cualquier persona con acceso de escritura a un directorio compartido podría ocultar código malicioso, por ejemplo, en /bin/ls. Ese código se ejecutará cuando ejecute ls en el directorio compartido.
direnv no resuelve este problema (funciona en base a archivos .envrc, pero cualquiera podría colocarlos), pero al menos le hace saber cuando hace un cd en un directorio que $ PATH se está modificando:
$ cd my_project
direnv: loading .envrc
direnv export: ~PATH