Opción 1: un enlace simbólico colocado más apropiadamente

Opción 1: un enlace simbólico colocado más apropiadamente

Estoy usando macOS y mi shell es zsh. De forma predeterminada, el directorio de inicio de mi sistema es /Users/njohn. Creé un enlace simbólico a esta ruta /usr/local/home. Puse HOME="/usr/local/home"mi .zshrc. Hice esto para que, primero, pueda acceder rápidamente cd ..desde mi directorio de inicio y estar en /usr/localel lugar donde se encuentran todos mis paquetes homebrew y archivos de configuración. Es un atajo realmente simple. También me gusta poder usar cdy llegar a mi ruta de enlace simbólico en lugar de la normal, que está muy alejada en el sistema de archivos de las cosas a las que me gustaría sentirme más cerca.

¿Podría esto romper algo? ¿Existe una manera más segura o mejor de lograr lo mismo?

Respuesta1

Descargo de responsabilidad: No uso ni he usado MacOS, por lo que no estoy completamente seguro de qué irregularidades o diferencias sutiles (si las hay) pueden existir entre Mac y *nix.

Para responder a su pregunta, el único escenario que podría imaginar "rotura" con esta configuración es cuando un programa determinado intenta hacer algo con su directorio de inicio y no sigue los enlaces simbólicos de forma predeterminada (o no sigue los enlaces simbólicos de forma predeterminada (o no los sigue, por alguna razón) . Si cualquier programa hipotético intenta leer/escribir algún archivo en su directorio de inicio y no resuelve su /usr/local/homeenlace simbólico, es probable que las cosas se rompan. Aunque la probabilidad de tal escenario me supera.

Dicho esto, creo que estaría mejor con un enfoque que no modifique su $HOMEvariable. Cambiar su $HOMEvariable a algo distinto a lo que el sistema entiende que es su directorio de inicio durante la vida útil de cada shell interactivo que inicie es feo, hackeo y seguramente causará problemas sutiles. Le proporcionaré tres alternativas mejores.

Opción 1: un enlace simbólico colocado más apropiadamente

Si desea seguir con un enlace simbólico, simplemente cree un enlace simbólico /usr/localdesde su directorio de inicio, elimine el /usr/local/homeenlace que tiene ahora y elimine la línea que cambia su $HOMEvariable de su archivo .zshrc. Por ejemplo:

% [~] ln -s /usr/local uloc
% [~] cd uloc
% [~/uloc] realpath .
/usr/local

De manera similar a lo que tiene actualmente, puede acceder rápidamente a /usr/local desde su directorio de inicio, excepto que de esta manera no necesita cambiar el archivo $HOME.

Opción 2: directorios con nombre

Dado que estás usando Zsh, recomendaría usar undirectorio con nombre. En lugar de HOME=/usr/local/home, haga algo como lo siguiente, reemplazándolo uloccon un nombre corto de su elección:

uloc=/usr/local

Luego, puede cambiar rápidamente a este directorio.de donde seade las siguientes maneras:

# With no special options set
% cd ~uloc

# Slightly shorter
% setopt cdable_vars
% cd uloc

# Even shorter
% setopt cdable_vars auto_cd
% uloc

Como puede ver, si tiene una variable que se expande a una ruta, puede cdacceder a ella en Zsh si le pone un ~carácter como prefijo, de forma similar a cómo puede usarla ~usercomo atajo para /home/user. Puede tener tantos directorios con nombre como desee, para poder tener acceso rápido acualquierdirectorio que utilizas frecuentemente, no solo /usr/localcomo en tu caso.

La cdable_varsopción le permite omitir los ~directorios con nombre cuando usa cd, y auto_cdsignifica que si ingresa un "comando" que en realidad es un directorio (con nombre o literal), Zsh irá automáticamente cda ese directorio. La combinación de estos dos le permite acceder rápidamente al directorio deseadoNo importa dónde estés. Contrariamente aOpción 1, dado que no depende de un enlace simbólico, cdacceda a este directorio con nombreDe hecho, te colocará en ese directorio., tal que pwdvolvería /usr/localy no /Users/njohn/uloc.

Opción 3: usar CDPATH

Este enfoque puede utilizarse solo o en conjunto conopcion 2.

También puede utilizar $CDPATH, que es una variable especial $PATHque contiene una lista de directorios. Sin embargo, a diferencia de $PATHlos directorios en $CDPATHse utilizarán como "raíz" para las rutas relativas proporcionadas cdsi la ruta proporcionada no se encuentra en el directorio actual. Para demostrarlo, considere lo siguiente:

# Zsh ties lowercase variants of the *PATH variables together as arrays. See zshparam(1) for details
% [~/foo] cdpath=(/usr/local)
% [~/foo] ls
bar/ baz/
% [~/foo] cd share
% [/usr/local/share]

Como no había ningún directorio nombrado shareen ~/foo, Zsh consultó $CDPATHlugares donde sharepodría haber un directorio secundario. Dado que /usr/localestaba en $CDPATHy sharees un directorio secundario de /usr/local, puede hacerlo cd sharedesde dentro de ~/foo. También puedes profundizar más; por ejemplo, si stufffuera un subdirectorio de /usr/local/share, podrías llegar allí ejecutando cd share/stuff.

Nota:a diferencia de Bash, Zsh siempre buscará en el directorio actualantesprobando directorios en $CDPATH,a menos quea .está incluido en $CDPATH. En ese caso, Zsh respeta estrictamente el orden de los directorios en $CDPATH.

Esto le permite aún más comodidad, ya que, como usted dijo, a menudo necesita acceso a sus paquetes y configuraciones de homebrew, puede cdacceder a uno de esos subdirectorios desde cualquier lugar, ¡sin necesidad de ningún tipo de prefijo!

Como ya se mencionó, puede combinar esto con directorios con nombre. Para sacar un ejemplo de mis propios archivos de puntos:

ZSH=~/.zsh
cdpath=(~/.zsh)

# I split my configuration up into separate files that live in separate
# directories, which all live under a 'modules' directory inside ~/.zsh
% [~] cd modules/directory
% [~ZSH/modules/directory] cd modules/git
% [~ZSH/modules/git]

Otras lecturas

Recomiendo familiarizarse más con Zsh y sus numerosas funciones*. Aquí hay algunas páginas de manual y otros temas que puede consultar:

  • symlink(7)— Describe los enlaces simbólicos en detalle y cómo interactúan con ellos.
  • zshexpn(1), "Directorios con nombres estáticos": explica los directorios con nombres y el resto de la página del manual describe todas las formas de expansión en Zsh.
  • zshparam(1), "PARÁMETROS UTILIZADOS POR EL SHELL": incluye descripciones de variables especiales como cdpathy similares
  • zshoptions(1)— Detalla todas las opciones que controlan el comportamiento de Zsh a través del setoptincorporado. Incluye explicaciones más detalladas de cdable_varsy auto_cdde las que proporciona esta respuesta.

información relacionada