Pregunta:
Tengo un .bash_profile
y en eso tengo un conjunto de alias. Esos alias en este momento ejecutan solo un comando y fue bastante fácil. Sin embargo, me gustaría hacer dos cosas con un nuevo alias que estoy tratando de crear.
- CD en un directorio
- Ejecuta un comando desde ese directorio
Respuesta:
Para ejecutar un comando con un directorio de trabajo específico, generalmente se hace
( cd directory && utility )
Los paréntesis alrededor del cd ...
significa que el comando (s) allí se ejecuta en una subcapa. Cambiar el directorio de trabajo en un subshell hace que no se cambie el directorio de trabajo actual del shell que llama, es decir, después de haber llamado a este comando, todavía estaría 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 tomar ningún argumento.
Para un directorio y una utilidad específicos , se podría hacer
alias cdrun='( cd "$HOME/somedir" && ./script.sh )'
pero para el caso general, tendría 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 usaría como
$ cdrun "$HOME/somedir" ./script.sh
que ejecutaría el script script.sh
ubicado en el directorio $HOME/somedir
, con $HOME/somedir
como directorio de trabajo, o
$ cdrun / ls -l
que le proporcionaría una lista de directorios en "formato largo" del directorio raíz.
La función de shell toma su primer argumento e intenta cambiar a ese directorio. Si eso funciona, cambia 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. command
es un command
incorporado 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 esto ejecutaría script.sh
ubicado en $HOME/somedir
con el directorio actual 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 PATH
entorno PATH
, por ejemplo
PATH="$PATH:$HOME/somedir"
Ahora script.sh
en $HOME/somedir
podrá ejecutarse desde cualquier lugar con solo usar
$ script.sh
Nuevamente, esto no cambia el directorio de trabajo del comando.