sintaxis ejemplos comandos comando basicos linux shell environment

linux - ejemplos - comandos unix



¿Cómo ejecuto un programa con un directorio de trabajo diferente al actual, desde el shell de Linux? (11)

Usando un shell de Linux, ¿cómo inicio un programa 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 programa ejecutando ../a/helloworld y obtener hello-world.txt en algún lugar de un tercer directorio /c .


Llama al programa así:

(cd /c; /a/helloworld)

Los paréntesis hacen que se genere un sub-shell. Este sub-shell luego cambia su directorio de trabajo a /c , luego ejecuta helloworld desde /a . Después de que el programa sale, el sub-shell termina, devolviéndote a tu prompt del shell primario, en el directorio desde el que comenzaste.

Manejo de errores: para evitar ejecutar el programa sin haber cambiado el directorio, p. Ej. Al haber escrito mal /c , haga que la ejecución de helloworld condicional:

(cd /c && /a/helloworld)

Reducción del uso de la memoria: para evitar que la memoria de desechos de subshell se ejecute mientras se ejecuta hello world, llame a helloworld través de exec:

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

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


Si quieres realizar esto dentro de tu programa, yo haría algo como:

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


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


Siempre creo que las herramientas UNIX deben escribirse como filtros, leer la entrada desde la entrada estándar y escribir la salida en la salida estándar. Si es posible, puede cambiar el binario de helloworld para escribir el contenido del archivo de texto en la salida estándar en lugar de un archivo específico. De esa manera puedes usar el shell para escribir tu archivo en cualquier lugar.

$ cd ~ / b

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


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)

Esta forma es más parecida a cómo usualmente ejecutas los comandos en el shell. Para ver la diferencia práctica, debe ejecutar ps ef desde otro shell con cada solución.


Simplemente cambia 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 envoltorio.

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

Aquí hay un ejemplo de script de shell bash:

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


Una opción que no requiere una subshell y está integrada en bash

(pushd SOME_PATH && run_stuff; popd)

Manifestación:

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


desde el directorio actual proporcione la ruta completa al directorio del script para ejecutar el comando

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


por qué no mantenerlo simple

cd SOME_PATH && run_some_command && cd -

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


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