chdir (< directorio >) no ' t cambia de directorio después de salir al shell

Quería hacer un programa C simple para cambiar al directorio de mi proyecto. Su contenido es el siguiente:

#include <unistd.h> int main() { chdir("/home/enedil/projects/algo"); return 0; } 

Lo compilé con el siguiente comando (pro.c es su nombre de archivo):

gcc pro.c -o /usr/local/bin/pro 

No hubo errores ni advertencias. Pero cuando lo ejecuto, no cambia de directorio. ¿Por qué?

Comentarios

  • En su lugar, podría usar un alias – alias proj='cd ~/enedil/projects/algo'
  • @MichaelDurrant oh, ¿te refieres a cd ~/projects/algo? ¡Es una idea!
  • ¡Esto es por diseño!

Responder

Su programa hace exactamente lo que le dice que haga: cambia el directorio de trabajo para mismo a /home/enedil/projects/algo. Pero una vez que sale, el directorio de trabajo shell «s se restaura.

Supongo que es lo que quieres lograr es cambiar el directorio de trabajo del proceso padre, es decir, el shell, sin recurrir a un simple cd. Hay un método , pero como dice su autor: no lo hagas.

Comentarios

  • Nitpick, pero el shell ' s directorio de trabajo no ' t restaurado, porque nunca cambió. El shell es simplemente un proceso, al igual que el programa. Cada programa tiene su propio directorio de trabajo '.
  • @Patrick, verdadero. Conceptualmente más preciso sería su directorio de trabajo restaurado, en el sentido de que su proceso " restaurado " (es activo en primer plano).

Respuesta

El directorio de trabajo actual es local para el proceso. Entonces, lo que quieres no es posible.

Responder

También puedes usar CDPATH variable de entorno. Como se explica en man bash:

 CDPATH The search path for the cd command. This is a colon-separated list of directories in which the shell looks for destination directories specified by the cd command. A sample value is ".:~:/usr". 

Entonces, por ejemplo, podría agregar esta línea a su ~/.profile:

CDPATH=~/projects 

Ahora puede ejecutar cd projects desde cualquier directorio y mover a ~/projects.

Responder

Para hacer esto para el shell, use el source comando (con alias de .). Ejecutará la aplicación en el contexto del shell actual en lugar de crear un nuevo contexto de shell. Así es como también puede establecer variables de entorno. Si observa todas las secuencias de comandos de inicio en /etc/rc.d o /etc/init.d, verá muchas secuencias de comandos que están incluidas en otras secuencias de comandos con el comando

. /etc/init.d/rcvars 

El . hace que el script /etc/init.d/rcvars los cambios persisten en el entorno actual.

Comentarios

  • No puede ' ejecutar un programa en C de esta manera, solo un script de shell.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *