chdir (<directory>) no cambia el directorio después de salir a shell

8

Quería hacer un Cprograma simple para cambiar a mi directorio de proyectos. Su contenido es el siguiente:

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

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

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

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

enedil
fuente
1
Podría usar un alias en su lugar -alias proj='cd ~/enedil/projects/algo'
Michael Durrant
@ MichaelDurrant oh, querías decir cd ~/projects/algo? Es una idea!
enedil
1
Esto es por diseño!
Thorbjørn Ravn Andersen

Respuestas:

15

Su programa hace exactamente lo que te diga que hacer: se cambia el directorio de trabajo para a /home/enedil/projects/algo. Pero una vez que sale, se restaura el directorio de trabajo del shell .

Supongo que 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.

Kempniu
fuente
8
Nitpick, pero el directorio de trabajo del shell no se restaura, porque nunca cambió. El shell es simplemente un proceso, al igual que el programa. Cada programa tiene su propio directorio de trabajo.
Patrick
1
@Patrick, cierto. Conceptualmente más preciso sería la restauración de su directorio de trabajo, ya que su proceso está "restaurado" (está activo en primer plano).
Paul Draper
5

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

vinc17
fuente
1

También puede usar la CDPATHvariable ambiental. 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 projectsdesde cualquier directorio y moverse a ~/projects.

BLIELI
fuente
0

Para hacer esto para el shell, use el sourcecomando (alias .). 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 todos los scripts de inicio en /etc/rc.do /etc/init.d, verá muchos scripts incluidos por otros scripts con el comando

. /etc/init.d/rcvars

Esto .provoca que el script /etc/init.d/rcvarsse modifique y que todo lo que cambie persista en el entorno actual.

Walter
fuente
1
No puede ejecutar un programa en C de esta manera, solo un script de shell.
John Kugelman