Ik wilde een eenvoudig C
programma maken om naar mijn projectdirectory te gaan. De inhoud is als volgt:
#include <unistd.h> int main() { chdir("/home/enedil/projects/algo"); return 0; }
Ik heb het gecompileerd met het volgende commando (pro.c
is de bestandsnaam):
gcc pro.c -o /usr/local/bin/pro
Er waren geen fouten of waarschuwingen. Maar als ik het start, verandert het niet van directory. Waarom?
Reacties
Antwoord
Je programma doet precies wat u hem opdraagt: het verandert de werkdirectory voor zelf naar /home/enedil/projects/algo
. Maar als het eenmaal is afgesloten, wordt de shell “s werkdirectory hersteld.
Ik denk wat je wilt om te bereiken is het veranderen van de werkdirectory van het bovenliggende proces, dwz de shell, zonder toevlucht te nemen tot een simpele cd
. Er is een methode , maar zoals de auteur zegt: doe het niet.
Reacties
- Nitpick, maar de shell ' s werkdirectory is niet ' t hersteld, omdat deze nooit is gewijzigd. De shell is gewoon een proces, net als het programma. Elk programma heeft zijn eigen werkdirectory van '.
- @Patrick, true. Conceptueel nauwkeuriger zou zijn dat uw werkmap is hersteld, in die zin dat uw proces " hersteld " (is actief op de voorgrond).
Answer
De huidige werkdirectory is lokaal voor het proces. Dus wat je wilt, is niet mogelijk.
Answer
Je kunt ook de CDPATH
omgevingsvariabele. Zoals uitgelegd in 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".
U kunt deze regel bijvoorbeeld toevoegen aan uw ~/.profile
:
CDPATH=~/projects
U kunt nu cd projects
vanuit elke map starten en verplaatsen naar ~/projects
.
Answer
Om dit voor de shell te doen, gebruik je de source
-opdracht (gealiast aan .
). Het zal de applicatie uitvoeren in de context van de huidige shell in plaats van een nieuwe shell-context te creëren. Dit is hoe u ook omgevingsvariabelen kunt instellen. Als je alle opstartscripts opmerkt in /etc/rc.d
of /etc/init.d
, zul je veel scripts zien die door andere scripts met de opdracht worden meegeleverd
. /etc/init.d/rcvars
De .
zorgt ervoor dat het script /etc/init.d/rcvars
de wijzigingen blijven bestaan in de huidige omgeving.
Reacties
- Je kunt ' geen C-programma draaien op deze manier alleen een shellscript.
alias proj='cd ~/enedil/projects/algo'
cd ~/projects/algo
? Het is een idee!