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
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.
alias proj='cd ~/enedil/projects/algo'
cd ~/projects/algo
? Det är en idé!