chdir (< katalog >) endrer ikke ' t katalog etter å ha gått ut til skall

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

  • Du kan bruke et alias i stedet – alias proj='cd ~/enedil/projects/algo'
  • @MichaelDurrant å, du mente cd ~/projects/algo? Det er en idé!
  • Dette er av design!

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.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *