GNU/Linux >> Tutoriales Linux >  >> Linux

Zsh/bash:¿Expandir rutas relativas en argumentos de comando utilizando reglas de estructura de directorio lógico antes de la ejecución?

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


Linux
  1. ¿Por qué es legal establecer una variable antes de un comando en Bash?

  2. Usando el comando de suspensión de Linux en Bash Scripts

  3. ¿Dividir la salida del comando por columnas usando Bash?

  4. Argumentos de la línea de comando para ejecutar la ventana acoplable

  5. Establecer el tiempo relativo usando la línea de comando

Cómo ver la estructura del árbol de directorios en Linux

Cómo cambiar automáticamente a un directorio sin usar el comando Cd en Linux

Diferentes formas de enumerar los contenidos del directorio sin usar el comando ls

Bash Scripting:analizar argumentos en Bash Scripts usando getopts

¿Cómo imprimir el directorio de trabajo usando el comando pwd de Linux?

Usando el comando Dirname de Linux en Bash Scripts