chdir (< katalog >) ændrer ikke ' t skift efter at have afsluttet til shell

Jeg ville lave et simpelt C program til at skifte til min projektmappe. Dens indhold er som følger:

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

Jeg kompilerede det med følgende kommando (pro.c er dets filnavn):

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

Der var ingen fejl eller advarsler. Men når jeg kører det, ændrer det ikke biblioteket. Hvorfor?

Kommentarer

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

Svar

Dit program gør nøjagtigt, hvad du beder den om at gøre: den ændrer arbejdsmappen til selv til /home/enedil/projects/algo. Men når den kommer ud, gendannes shell “s -mappen.

Jeg gætter på, hvad du vil have at opnå er at ændre arbejdsprogrammet for den overordnede proces, dvs. skallen, uden at bruge en simpel cd. Der er en metode , men som forfatteren siger: gør det ikke.

Kommentarer

  • Nitpick, men skallen ' s arbejdsmappe er ikke ' t gendannet, fordi den aldrig ændrede sig. Skallen er simpelthen en proces, ligesom programmet er. Hvert program har det ' s egen arbejdsmappe.
  • @Patrick, sandt. Konceptuelt mere nøjagtigt ville være din arbejdsmappe gendannes, idet din proces er " gendannet " (er aktiv i forgrunden).

Svar

Den aktuelle arbejdsmappe er lokal for processen. Så det, du ønsker, er ikke muligt.

Svar

Du kan også bruge CDPATH miljøvariabel. Som forklaret 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 tilføje denne linje til din ~/.profile:

CDPATH=~/projects 

Du kan nu køre cd projects fra ethvert bibliotek og flytte til ~/projects.

Svar

For at gøre dette for skallen skal du bruge source kommando (alias til .). Det kører applikationen i sammenhæng med den aktuelle shell i stedet for at oprette en ny shell-kontekst. Sådan kan du også indstille miljøvariabler. Hvis du bemærker alle opstartsskripterne i /etc/rc.d eller /etc/init.d, vil du se mange scripts, der er inkluderet i andre scripts med kommandoen

. /etc/init.d/rcvars 

. forårsager scriptet /etc/init.d/rcvars ændringerne fortsætter i det nuværende miljø.

Kommentarer

  • Du kan ' ikke køre et C-program på denne måde kun et shell-script.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *