chdir (< directory >) verandert niet ' van directory na afsluiten naar shell

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

  • Je zou in plaats daarvan een alias kunnen gebruiken – alias proj='cd ~/enedil/projects/algo'
  • @MichaelDurrant oh, je bedoelde cd ~/projects/algo? Het is een idee!
  • Dit is zo ontworpen!

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.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *