Alias ​​al CD en un directorio y llama a un comando

Alias ​​al CD en un directorio y llama a un comando

Tengo un .bash_profiley en ese tengo un conjunto de alias. Esos alias por el momento ejecutan solo un comando y fue bastante fácil. Sin embargo, me gustaría hacer dos cosas con un nuevo alias que estoy intentando crear.

  1. CD en un directorio
  2. Ejecute un comando desde ese directorio

Respuesta1

Para ejecutar un comando con un directorio de trabajo específico, normalmente se hace

( cd directory && utility )

Los paréntesis alrededor de cd ...significa que los comandos que contiene se ejecutan en una subcapa. Cambiar el directorio de trabajo en un subshell hace que el directorio de trabajo actual del shell que llama no cambie, es decir, después de haber llamado este comando, aún estará ubicado en el mismo directorio donde comenzó.

Ejemplo:

( cd / && echo "$PWD" )  # will output "/"
echo "$PWD"              # will output whatever directory you were in at the start

Esto no se puede convertir en un alias genérico ya que un alias no puede aceptar ningún argumento.

Paraespecíficodirectorio y utilidad, uno podría hacer

alias cdrun='( cd "$HOME/somedir" && ./script.sh )'

pero para el caso general, tendrías que usar una función de shell:

cdrun () {
    ( cd "$1" && shift && command "$@" )
}

o

cdrun () (
    cd "$1" && shift && command "$@"
)

Reemplazar las llaves con paréntesis alrededor del cuerpo de la función hace que la función se ejecute en su propia subcapa.

Esto se utilizaría como

$ cdrun "$HOME/somedir" ./script.sh

que ejecutaría el script script.shubicado en el directorio $HOME/somedir, $HOME/somedircomo directorio de trabajo, o

$ cdrun / ls -l

lo que le proporcionaría una lista de directorios en "formato largo" del directorio raíz.

La función Shell toma su primer argumento e intenta cambiar a ese directorio. Si eso funciona, elimina el nombre del directorio de los parámetros posicionales (la lista de argumentos de la línea de comando) y ejecuta el comando dado por el resto de los argumentos. commandes un comando integrado en el shell que simplemente ejecuta sus argumentos como un comando.


Todo esto es necesario si desea ejecutar un comando.con un directorio de trabajo modificado. Si solo desea ejecutar un comando ubicado en otro lugar, obviamente podría usar

alias thing='$HOME/somedir/script.sh'

pero este correría script.shubicado en$HOME/somedir con elactualdirectorio como directorio de trabajo.

Otra forma de ejecutar un script ubicado en otro lugar sin cambiar el directorio de trabajo es agregar la ubicación del script a su PATHvariable de entorno, por ejemplo

PATH="$PATH:$HOME/somedir"

Ahora script.shse $HOME/somedirpodrá ejecutar desde cualquier lugar con solo usar

$ script.sh

De nuevo, esto hacenocambie el directorio de trabajo para el comando.

Respuesta2

alias <name-of-the-alias>='cd <the-directory> && <command>'

Entonces, si desea cambiar el directorio (cd) a la carpeta /var/log/y luego enumerar (ls) sus archivos, puede agregar en su .bash_profilearchivo lo siguiente:

alias logs='cd /var/log/ && ls'

Respuesta3

Utilizo esta función para ejecutar un solo comando en un directorio diferente:

cd1 () {
  if [ $# -eq 1 ]; then
    command cd -- "$1"
  else
    ( command cd -- "$1" && shift && "$@" )
  fi
}

Una limitación de esta función es que los comodines se completan en relación con el directorio original, no en relación con el directorio donde se ejecuta el comando.Es posible hacerlo mejor en zsh.

Esta función actúa como una función normal cdsi se llama con un solo argumento, por lo que es posible que desees llamarla cd. (Esta función no admite ninguna opción, pero las opciones cdrara vez se utilizan).

Respuesta4

Separe los comandos con punto y coma, por ejemplo:

alias do_something='cd /tmp; ls'

información relacionada