¿Hay alguna manera de ejecutar un comando en un directorio diferente sin tener cd
que hacerlo? Sé que podría simplemente entrar cd
y cd
salir, pero solo estoy interesado en las posibilidades de renunciar a los pasos adicionales :)
linux
bash
cd-command
Naftuli Kay
fuente
fuente
echo "#!/bin/bash; cd $1; exec $2" > /usr/local/bin/execindirectory; chmod +x /usr/local/bin/execindirectory
. Es posible que deba esforzarse un poco más si desea que realmente sea compatible con las "etiquetas" de opciones, tales como-d
y otras cosas.Respuestas:
No sé si esto cuenta, pero puedes hacer una subshell:
El directorio solo se cambia para esa subshell, por lo que evitará el trabajo de necesitar
cd -
después.fuente
$ (cd /var/log && cp *.log ~/Desktop)
. De esa manera, si el directorio no existe, no se ejecutan más comandos.Algunos programas tienen opciones con las que puede decirles que se hagan chdir (2) ellos mismos (por ejemplo, GNU tar 's
-C
/--directory
).Sin embargo, fuera de tales programas, algo tendrá que cambiar . Podrías escribir y usar algún tipo de programa "binario" compilado en lugar de que el shell lo haga, pero probablemente no produciría muchos beneficios.
En un comentario en otra respuesta, usted dio un ejemplo:
Como el
*.log
patrón se expande por el propio shell (no cp ), algo tendrá que cambiar al directorio antes de que un shell evalúe su comando.Si solo está interesado en evitar tener que "devolver el CD", puede usar una subshell para aislar el efecto del CD de su instancia de shell de trabajo.
Puede empaquetar esto en una función de shell. (Eliminé la
-d
opción de su uso de ejemplo, ya que este comando no tiene mucho sentido si el directorio es realmente opcional).fuente
No para socavar el valor de las respuestas dadas por otras personas, pero creo que lo que quieres es esto:
Tenga en cuenta los parens para invocar
cd
en un sub-shell.fuente
Aquí hay algo que debería permitirle
cd
regresar a donde estaba (usando Bash), ya que no olvidarse de hacerlo parece ser el propósito de la pregunta:(EDITAR: versión ligeramente más corta, gracias a @ Random832)
fuente
pushd other-dir
, en lugar depushd .; cd other-dir
Tristemente, tu ejemplo:
no necesita un cambio en el directorio, porque
haría lo mismo ¿No puedes acercarte a tu verdadero problema? Porque podríamos conocer una mejor solución para eso también.
Una forma complicada de resolver su problema, que está muy lejos de la elegancia de la solución de Michaels, es el uso de find, que tiene un interruptor '-execdir' que se realiza en el directorio, donde se encuentra un archivo. Mal adoptado a su ejemplo:
Quizás sea útil para tu problema real. -okdir en lugar de -execdir le pedirá que confirme cada invocación.
-okdir y -execdir pueden necesitar la instalación de gnu-find, que generalmente se usa en Linux.
fuente
¿Qué tal
./your/path/command.sh
?fuente
execindirectory -d /var/log "cp *.log ~/Desktop"
.