¿Cómo puede Bash ejecutar un comando en un contexto de directorio diferente?

94

Tengo un comando común que se llama desde directorios muy específicos. Solo hay un ejecutable en / bin para este programa, y ​​el directorio de trabajo actual es muy importante para ejecutarlo correctamente. El script afecta a los archivos que viven dentro del directorio en el que se ejecuta.

Ahora, también tengo un script de shell personalizado que hace algunas cosas en un directorio, pero necesito llamar al comando mencionado anteriormente como si estuviera en otro directorio.

¿Cómo se hace esto en un script de shell?

Marty Wallace
fuente

Respuestas:

39

Puede utilizar las cdfunciones incorporadas o pushdy popdpara este propósito. Por ejemplo:

# do something with /etc as the working directory
cd /etc
:

# do something with /tmp as the working directory
cd /tmp
:

Puede utilizar las funciones integradas como cualquier otro comando y puede cambiar el contexto del directorio tantas veces como desee en un script.

Todd A. Jacobs
fuente
4
También hay cd -un shell POSIX para volver al directorio anterior. Dicho esto, (a) pushdy popdestán realmente diseñados para uso interactivo, y (b) no siempre es seguro asumir que puede cdretroceder donde comenzó, especialmente en subsistemas complejos que pueden usar permisos restrictivos internamente (consulte stackoverflow.com/questions/ 10555284 /… ).
geekosaur
3
Usar una subcapa es una solución mucho mejor
josh123a123
Para la creación de scripts, una subcapa es probablemente una mejor idea. Sin embargo, estoy muy feliz de conocerlo popd.
connorbode
¿Puede explicar qué significa :símbolo aquí?
Vadim Kotov
2
@VadimKotov Creo que es efectivamente una operación no operativa. Sección relevante de man bashlecturas: : [arguments]Sin efecto; el comando no hace nada más que expandir argumentos y realizar cualquier redirección especificada. El estado de devolución es cero.
boycy
218

Utilizar cden una subcapa; la forma abreviada de utilizar este tipo de subcapa es el paréntesis.

(cd wherever; mycommand ...)

Dicho esto, si su comando tiene un entorno que requiere, realmente debería asegurarse de que el entorno en sí mismo en lugar de poner la responsabilidad en cualquier cosa que quiera usarlo (a menos que sea un comando interno usado en circunstancias muy específicas en el contexto de un pozo definido un sistema más grande, de modo que cualquier persona que llama ya necesita garantizar el entorno que requiere). Por lo general, esto sería algún tipo de envoltorio de script de shell.

geekosaurio
fuente
También puede insertar un \después de cada uno ;para comandos de varias líneas dentro del mismo contexto.
Chiramisu
36
(cd /path/to/your/special/place;/bin/your-special-command ARGS)
bmargulies
fuente
20

Si desea volver a su directorio de trabajo actual:

current_dir=$PWD;cd /path/to/your/command/dir;special command ARGS;cd $current_dir;
  1. Establecemos una variable current_dirigual a supwd
  2. después de eso vamos a cd a donde necesita ejecutar su comando
  3. entonces estamos ejecutando el comando
  4. luego cdvolveremos a nuestra variablecurrent_dir

Otra solución de @apieceofbart pushd && YOUR COMMAND && popd

abc123
fuente
4
o podrías hacerlopushd && YOUR COMMAND && pulld
apieceofbart
4
@apieceofbart Creo que quisiste decir en popdlugar de pulld.
Konstantin