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/local
el lugar donde se encuentran todos mis paquetes homebrew y archivos de configuración. Es un atajo realmente simple. También me gusta poder usar cd
y 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/home
enlace 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 $HOME
variable. Cambiar su $HOME
variable 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/local
desde su directorio de inicio, elimine el /usr/local/home
enlace que tiene ahora y elimine la línea que cambia su $HOME
variable 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 uloc
con 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 cd
acceder a ella en Zsh si le pone un ~
carácter como prefijo, de forma similar a cómo puede usarla ~user
como 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/local
como en tu caso.
La cdable_vars
opción le permite omitir los ~
directorios con nombre cuando usa cd
, y auto_cd
significa que si ingresa un "comando" que en realidad es un directorio (con nombre o literal), Zsh irá automáticamente cd
a 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, cd
acceda a este directorio con nombreDe hecho, te colocará en ese directorio., tal que pwd
volvería /usr/local
y 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 $PATH
que contiene una lista de directorios. Sin embargo, a diferencia de $PATH
los directorios en $CDPATH
se utilizarán como "raíz" para las rutas relativas proporcionadas cd
si 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 share
en ~/foo
, Zsh consultó $CDPATH
lugares donde share
podría haber un directorio secundario. Dado que /usr/local
estaba en $CDPATH
y share
es un directorio secundario de /usr/local
, puede hacerlo cd share
desde dentro de ~/foo
. También puedes profundizar más; por ejemplo, si stuff
fuera 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 cd
acceder 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 comocdpath
y similareszshoptions(1)
— Detalla todas las opciones que controlan el comportamiento de Zsh a través delsetopt
incorporado. Incluye explicaciones más detalladas decdable_vars
yauto_cd
de las que proporciona esta respuesta.