Volevo creare un semplice programma C
per passare alla directory del mio progetto. Il suo contenuto è il seguente:
#include <unistd.h> int main() { chdir("/home/enedil/projects/algo"); return 0; }
Lho compilato con il seguente comando (pro.c
è il nome del file):
gcc pro.c -o /usr/local/bin/pro
Non sono stati rilevati errori né avvisi. Ma quando lo eseguo, non cambia directory. Perché?
Commenti
Rispondi
Il tuo programma fa esattamente quello che gli dici di fare: cambia la directory di lavoro per se stesso in /home/enedil/projects/algo
. Ma una volta terminato, la directory di lavoro shell “s viene ripristinata.
Immagino quello che vuoi da ottenere è cambiare la directory di lavoro del processo genitore, cioè la shell, senza ricorrere a un semplice cd
. Cè a metodo , ma come dice lautore: non farlo.
Commenti
- Nitpick, ma la shell ' non è ' ripristinata, perché non è mai cambiata. La shell è semplicemente un processo, proprio come lo è il programma. Ogni programma ha la ' directory di lavoro.
- @Patrick, true. Concettualmente più accurato sarebbe la directory di lavoro ripristinata, in quanto il processo è " ripristinato " (è attivo in primo piano).
Risposta
La directory di lavoro corrente è locale al processo. Quindi, quello che vuoi non è possibile.
Rispondi
Puoi anche utilizzare CDPATH
variabile 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 projects
da qualsiasi directory e spostare a ~/projects
.
Risposta
Per eseguire questa operazione per la shell, utilizzare il source
(con alias a .
). Eseguirà lapplicazione nel contesto della shell corrente invece di creare un nuovo contesto di shell. È così che puoi impostare anche le variabili dambiente. Se noti tutti gli script di avvio in /etc/rc.d
o /etc/init.d
, vedrai molti script inclusi da altri script con il comando
. /etc/init.d/rcvars
.
fa in modo che lo script /etc/init.d/rcvars
cambia persiste nellambiente corrente.
Commenti
- Puoi ' t eseguire un programma C in questo modo, solo uno script di shell.
alias proj='cd ~/enedil/projects/algo'
cd ~/projects/algo
? È unidea!