chdir (<directory>) non cambia directory dopo essere uscito dalla shell


8

Volevo fare un semplice Cprogramma per passare alla directory del mio progetto. Il suo contenuto è il seguente:

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

L'ho compilato con il seguente comando ( pro.cè il nome del suo file):

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

Non ci sono stati errori né avvisi. Ma quando lo eseguo, non cambia directory. Perché?


1
Invece potresti usare un alias -alias proj='cd ~/enedil/projects/algo'
Michael Durrant,

@MichaelDurrant oh, intendevi cd ~/projects/algo? È un'idea!
enedil,

1
Questo è di design!
Thorbjørn Ravn Andersen,

Risposte:


15

Il vostro programma fa esattamente quello che dice di fare: cambia la directory di lavoro per a /home/enedil/projects/algo. Ma una volta uscito, la directory di lavoro della shell viene ripristinata.

Immagino che ciò che vuoi ottenere sia cambiare la directory di lavoro del processo genitore, cioè la shell, senza ricorrere a un semplice cd. C'è un metodo , ma come dice l'autore: non farlo.


8
Nitpick, ma la directory di lavoro della shell non viene ripristinata, perché non è mai cambiata. La shell è semplicemente un processo, proprio come il programma. Ogni programma ha la sua directory di lavoro.
Patrick,

1
@Patrick, vero. Concettualmente più accurato sarebbe il ripristino della directory di lavoro, in quanto il processo è "ripristinato" (è attivo in primo piano).
Paul Draper,

5

La directory di lavoro corrente è locale al processo. Quindi, ciò che vuoi non è possibile.


1

Puoi anche usare la CDPATHvariabile ambientale. Come spiegato in 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".

Quindi, ad esempio, potresti aggiungere questa riga al tuo ~/.profile:

CDPATH=~/projects

Ora puoi eseguire cd projectsda qualsiasi directory e passare a ~/projects.


0

Per fare ciò per la shell, utilizzare il sourcecomando (con aliasing .). Eseguirà l'applicazione nel contesto della shell corrente anziché creare un nuovo contesto di shell. Ecco come è possibile impostare anche le variabili di ambiente. Se noti tutti gli script di avvio in /etc/rc.do /etc/init.d, vedrai molti script inclusi in altri script con il comando

. /etc/init.d/rcvars

Ciò .causa lo script in /etc/init.d/rcvarsmodo che tutto ciò che cambia persista nell'ambiente attuale.


1
Non è possibile eseguire un programma C in questo modo, solo uno script di shell.
John Kugelman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.