urls una rutas ruta relativos relativas relativa qué absolutos absolutas absoluta macos shell environment-variables fish

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

  1. En esa página, el autor da el ejemplo set -U fish_user_paths ~/bin . Esto sobrescribe fish_user_paths con un valor único de ~/bin . Para evitar la pérdida de rutas de acceso establecidas en fish_user_paths , asegúrese de incluir $fish_user_paths además de las nuevas rutas que se agreguen (como se ve en mi respuesta).

  2. 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