¿Cómo ejecuto un progtwig con un directorio de trabajo diferente al actual, desde el shell de Linux?

Usando un shell de Linux, ¿cómo comienzo un progtwig con un directorio de trabajo diferente del directorio de trabajo actual?

Por ejemplo, tengo un archivo binario helloworld que crea el archivo hello-world.txt en el directorio actual. Este archivo está dentro del directorio /a . Actualmente estoy en el directorio /b . Quiero iniciar mi progtwig ejecutando ../a/helloworld y obtener el hello-world.txt en algún lugar de un tercer directorio /c .

Llame al progtwig de esta manera:

 (cd /c; /a/helloworld) 

Los paréntesis causan que se cree un subconjunto. Este subconjunto luego cambia su directorio de trabajo a /c , luego ejecuta helloworld desde /a . Después de que el progtwig sale, el subcuadro finaliza, volviendo a su solicitud del shell principal, en el directorio desde el que comenzó.

Manejo de errores: para evitar ejecutar el progtwig sin haber cambiado el directorio, por ejemplo, al tener mal escrito /c , realice la ejecución de helloworld condicional:

 (cd /c && /a/helloworld) 

Reducción del uso de la memoria: para evitar que la memoria de la subshell se desperdicie mientras se ejecuta hello world, llame a helloworld vía exec:

 (cd /c && exec /a/helloworld) 

[¡Gracias a Josh y Juliano por darnos consejos para mejorar esta respuesta!]

Similar a la respuesta de David Schmitt , más la sugerencia de Josh, pero no deja un proceso de shell en ejecución:

 (cd /c && exec /a/helloworld) 

De esta manera es más similar a la forma en que usualmente ejecuta comandos en el shell. Para ver la diferencia práctica, debe ejecutar ps ef desde otro shell con cada solución.

 sh -c 'cd /c && ../a/helloworld' 

Siempre pienso que las herramientas de UNIX deben escribirse como filtros, leer las entradas de stdin y escribir salidas en stdout. Si es posible, puede cambiar su binario helloworld para escribir el contenido del archivo de texto en stdout en lugar de un archivo específico. De esa manera puede usar el shell para escribir su archivo en cualquier lugar.

$ cd ~ / b

$ ~ / a / helloworld> ~ / c / helloworld.txt

Una opción que no requiere una subshell y está incorporada para bash

 (pushd SOME_PATH && run_stuff; popd) 

Manifestación:

 $ pwd /home/abhijit $ pushd /tmp # directory changed $ pwd /tmp $ popd $ pwd /home/abhijit 

Simplemente cambie el último “&&” en “;” y se devolverá sin importar si el comando falla o tiene éxito:

 cd SOME_PATH && run_some_command ; cd - 

Una forma de hacerlo es crear un script de shell contenedor.

El script de shell cambiaría el directorio actual a / c, luego ejecutar / a / helloworld. Una vez que el script de shell sale, el directorio actual vuelve a ser / b.

Aquí hay un ejemplo de script bash shell:

 #!/bin/bash cd /c /a/helloworld 

Si siempre quiere que vaya a / C, use una ruta absoluta cuando escriba el archivo.

Si desea realizar esto dentro de su progtwig, entonces haría algo como:

 #include  int main() { if(chdir("/c") < 0 ) { printf("Failed\n"); return -1 ; } // rest of your program... } 

por qué no mantenerlo simple

cd SOME_PATH && run_some_command && cd -

el último comando ‘cd’ lo llevará de regreso al último directorio de pwd. Esto debería funcionar en todos los sistemas * nix.

desde el directorio actual proporciona la ruta completa al directorio de scripts para ejecutar el comando

 /root/server/user/home/bin/script.sh