Utilizando 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 comenzar a ejecutar mi programa ../a/helloworld
y obtener el hello-world.txt
algún lugar en un tercer directorio /c
.
linux
shell
environment
Anton Daneyko
fuente
fuente
su
restablece el directorio de trabajo al directorio de inicio del usuario que especifique antes de ejecutar cualquier-c
comando. Esto fue muy útil para mí.Respuestas:
Llame al programa así:
Los paréntesis hacen que se genere una subcapa. Este sub-shell luego cambia su directorio de trabajo a
/c
, luego se ejecutahelloworld
desde/a
. Una vez que se cierra el programa, el subconjunto finaliza y regresa al indicador del shell principal, en el directorio desde el que comenzó.Manejo de errores: para evitar ejecutar el programa sin haber cambiado el directorio, por ejemplo, cuando se ha escrito mal
/c
, haga que la ejecución dehelloworld
condicional:Reducción del uso de memoria: para evitar que el subshell desperdicie memoria mientras se ejecuta hello world, llame a
helloworld
través de exec:[¡Gracias a Josh y Juliano por dar consejos para mejorar esta respuesta!]
fuente
Similar a la respuesta de David Schmitt , más la sugerencia de Josh, pero no deja un proceso de shell en ejecución:
De esta manera es más similar a la forma en que normalmente ejecuta comandos en el shell. Para ver la diferencia práctica, debe ejecutar
ps ef
desde otro shell con cada solución.fuente
Una opción que no requiere una subshell y está integrada en bash
Manifestación:
fuente
pushd SOME_PATH && run_stuff && popd
: si run_stuff falla, entonces popd no se ejecutará.set -e
el archivo y luego no lo harápopd
.pushd "${SOME_PATH}" && run_stuff; popd
es mejor que la respuesta actual, ya que la semántica pushd / popd se diseñó específicamente para esta situación de ir a algún directorio y luego volver al original.fuente
Siempre pienso que las herramientas UNIX deberían escribirse como filtros, leer la entrada de stdin y escribir la salida en stdout. Si es posible, podría 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
fuente
Simplemente cambie el último "&&" a ";" y devolverá el CD sin importar si el comando falla o tiene éxito:
fuente
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 se cierra el script de shell, el directorio actual vuelve a / b.
Aquí hay un ejemplo de script de shell bash:
fuente
por qué no hacerlo simple
cd SOME_PATH && run_some_command && cd -
el último comando 'cd' lo llevará de regreso al último directorio pwd. Esto debería funcionar en todos los sistemas * nix.
fuente
run_some_command
falla,cd -
no se ejecutará.Si siempre desea que vaya a / C, use una ruta absoluta cuando escriba el archivo.
fuente
Si desea realizar esto dentro de su programa, entonces haría algo como:
fuente
desde el directorio actual proporcione la ruta completa al directorio del script para ejecutar el comando
fuente