chdir (< katalog >) ändrar inte ' t katalog efter att ha avslutats till skal

Jag ville skapa ett enkelt C -program för att ändra till min projektkatalog. Dess innehåll är som följer:

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

Jag kompilerade det med följande kommando (pro.c är filnamnet):

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

Det fanns inga fel eller varningar. Men när jag kör den ändrar den inte katalogen. Varför?

Kommentarer

  • Du kan använda ett alias istället – alias proj='cd ~/enedil/projects/algo'
  • @MichaelDurrant åh, menade du cd ~/projects/algo? Det är en idé!
  • Det här är av design!

Svar

Ditt program gör exakt vad du säger att den ska göra: den ändrar arbetskatalogen för själv till /home/enedil/projects/algo. Men när den väl är klar återställs -skalet ”s arbetskatalog.

Jag antar vad du vill att uppnå är att ändra arbetsförteckningen för den överordnade processen, dvs. skalet, utan att använda en enkel cd. Det finns en metod , men som författaren säger: gör inte det.

Kommentarer

  • Nitpick, men skalet ' s arbetskatalog är inte ' t återställd eftersom den aldrig ändrades. Skalet är helt enkelt en process, precis som programmet är. Varje program har det ' s egen arbetskatalog.
  • @Patrick, sant. Konceptuellt mer exakt skulle din arbetskatalog återställas genom att din process är " återställd " (är aktiv i förgrunden).

Svar

Den aktuella arbetskatalogen är lokal för processen. Så vad du vill är inte möjligt.

Svar

Du kan också använda CDPATH miljövariabel. Som förklaras 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å till exempel kan du lägga till den här raden i ditt ~/.profile:

CDPATH=~/projects 

Du kan nu köra cd projects från vilken katalog som helst och flytta till ~/projects.

Svar

För att göra detta för skalet, använd source kommando (alias till .). Det kommer att köra applikationen i det aktuella skalets sammanhang snarare än att skapa ett nytt skalkontext. Så här kan du också ställa in miljövariabler. Om du märker alla startskript i /etc/rc.d eller /etc/init.d ser du många skript som ingår i andra skript med kommandot

. /etc/init.d/rcvars 

. orsakar skriptet /etc/init.d/rcvars så att allt ändringarna kvarstår i den nuvarande miljön.

Kommentarer

  • Du kan ' för att köra ett C-program på det här sättet bara ett skalskript.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *