Entonces sé que pwd
y cd
en el caparazón tienen un modo "lógico" y "físico" (consulte esta pregunta SO y las preguntas vinculadas desde allí).
Ahora, supongamos que tengo este enlace simbólico:
/home/<username>/foo -> /tmp/bar
Para seguir localmente, solo haz esto:
mkdir /tmp/bar
ln -s /tmp/bar ~/foo
Ahora, cuando empiezo en mi $HOME
y cd
en foo
, obtengo la ruta "lógica" (con la configuración predeterminada) con pwd
, y puede obtener la ruta "física" con -P
:
$ cd ~/foo
$ pwd
/home/<username>/foo
$ pwd -P
/tmp/bar
Por supuesto, “..
” siempre se refiere al padre de la ruta “física” (entiendo que ni siquiera es interpretado por el shell, simplemente se pasa al comando tal cual, y algunos comandos integrados especiales como cd
interprételo especialmente para obtener el comportamiento "lógico"):
$ pwd
/home/<username>/foo
$ realpath ..
/tmp
Lo que quiero es cuando estoy en $HOME/foo
(o cualquiera de sus subdirectorios) que cualquier ruta relativa que use (por ejemplo, ls -l ../..
) para ser interpretado/expandido en relación con la ruta "lógica" (está bien si tengo que anteponer algo a mi comando).
Por ejemplo:
$ pwd
/home/<username>/foo
$ vi ../something.txt
Quiero que esto se resuelva en vi /home/<username>/something.txt
.
¿Hay algo más fácil/más corto que hacer lo siguiente (o escribir una función de shell con la que pueda prefijar mi comando que repase todos los argumentos y, si se refieren a rutas, los expanda antes de pasarlos al comando)?
$ pwd
/home/<username>/foo
$ realpath -L $PWD/../something.txt
/home/<username>/something.txt
$ vi $(realpath -L $PWD/../something.txt)
¿Existe algo así como una "expansión de ruta lógica para parámetros de línea de comando que son rutas de archivo relativas que se realizan antes de que el shell ejecute el comando"? estoy usando zsh
, pero cualquier solución para bash
o zsh
estaría bien.
Respuesta aceptada:
Responderé esto por Zsh, ya que eso es lo que estoy usando.
Para obtener el efecto que desea con ..
al usar cd
, simplemente agregue lo siguiente a su ~/.zshrc
archivo:
setopt NO_chase_dots NO_chase_links
Documentación aquí:http://zsh.sourceforge.net/Doc/Release/Options.html#index-CHASEDOTS
Para todos los demás casos, en lugar de ..
, necesitará usar el :h
modificador de expansión ("cabeza"):
$ pwd
/home/<username>/foo
$ vi $PWD:h/something.txt
Si necesita subir más de un nivel, puede agregarle un número (siempre que rodee la expresión con llaves) o simplemente repita :h
:
# These two are equivalent:
$ vi ${PWD:h2}/foo
$ vi $PWD:h:h/foo
Documentación aquí:http://zsh.sourceforge.net/Doc/Release/Expansion.html#Modifiers