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
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.
alias proj='cd ~/enedil/projects/algo'
cd ~/projects/algo
? ¡Es una idea!