Jeg ønsket å lage et enkelt C
program for å endre til prosjektkatalogen min. Innholdet er som følger:
#include <unistd.h> int main() { chdir("/home/enedil/projects/algo"); return 0; }
Jeg kompilerte det med følgende kommando (pro.c
er filnavnet):
gcc pro.c -o /usr/local/bin/pro
Det var ingen feil eller advarsler. Men når jeg kjører den, endrer den ikke katalogen. Hvorfor?
Kommentarer
Svar
Programmet ditt gjør akkurat det du ber om å gjøre: det endrer arbeidskatalogen for seg selv til /home/enedil/projects/algo
. Men når den kommer ut, blir shell «s arbeidskatalog gjenopprettet.
Jeg antar hva du vil ha å oppnå er å endre arbeidskatalogen til den overordnede prosessen, dvs. skallet, uten å ty til en enkel cd
. Det er en metode , men som forfatteren sier: ikke gjør det.
Kommentarer
- Nitpick, men skallet ' s arbeidskatalog er ikke ' t gjenopprettet, fordi den aldri endret seg. Skallet er rett og slett en prosess, akkurat som programmet er. Hvert program har den ' sin egen arbeidskatalog.
- @Patrick, sant. Konseptuelt mer nøyaktig ville være arbeidskatalogen din blir gjenopprettet, ved at prosessen din er " gjenopprettet " (er aktiv i forgrunnen).
Svar
Den nåværende arbeidskatalogen er lokal for prosessen. Så det du ønsker er ikke mulig.
Svar
Du kan også bruke CDPATH
miljøvariabel. Som forklart i 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".
Så for eksempel kan du legge til denne linjen i ~/.profile
:
CDPATH=~/projects
Du kan nå kjøre cd projects
fra hvilken som helst katalog og flytte til ~/projects
.
Svar
For å gjøre dette for skallet, bruk source
kommando (alias til .
). Den vil kjøre applikasjonen i sammenheng med gjeldende skall i stedet for å opprette en ny skallkontekst. Slik kan du også sette miljøvariabler. Hvis du merker alle oppstartsskriptene i /etc/rc.d
eller /etc/init.d
, vil du se mange skript som er inkludert i andre skript med kommandoen
. /etc/init.d/rcvars
.
forårsaker skriptet /etc/init.d/rcvars
endringene vedvarer i det nåværende miljøet.
Kommentarer
- Du kan ' ikke kjøre et C-program på denne måten bare et skallskript.
alias proj='cd ~/enedil/projects/algo'
cd ~/projects/algo
? Det er en idé!