chdir (<Verzeichnis>) ändert das Verzeichnis nach dem Beenden der Shell nicht

8

Ich wollte ein einfaches CProgramm erstellen, um in mein Projektverzeichnis zu wechseln. Sein Inhalt ist wie folgt:

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

Ich habe es mit folgendem Befehl kompiliert ( pro.cist sein Dateiname):

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

Es gab keine Fehler oder Warnungen. Aber wenn ich es ausführe, ändert es nicht das Verzeichnis. Warum?

enedil
quelle
1
Sie könnten stattdessen einen Alias ​​verwenden -alias proj='cd ~/enedil/projects/algo'
Michael Durrant
@ MichaelDurrant oh, du meintest cd ~/projects/algo? Es ist eine Idee!
Ende
1
Dies ist beabsichtigt!
Thorbjørn Ravn Andersen

Antworten:

15

Ihr Programm macht genau das, was Sie ihm sagen: Es ändert das Arbeitsverzeichnis für sich in /home/enedil/projects/algo. Nach dem Beenden wird das Arbeitsverzeichnis der Shell wiederhergestellt.

Ich denke, was Sie erreichen möchten, ist, das Arbeitsverzeichnis des übergeordneten Prozesses, dh der Shell, zu ändern, ohne auf ein einfaches zurückzugreifen cd. Es gibt eine Methode , aber wie der Autor sagt: Tu es nicht.

Kempniu
quelle
8
Nitpick, aber das Arbeitsverzeichnis der Shell wird nicht wiederhergestellt, da es sich nie geändert hat. Die Shell ist einfach ein Prozess, genau wie das Programm. Jedes Programm hat ein eigenes Arbeitsverzeichnis.
Patrick
1
@ Patrick, stimmt. Konzeptionell genauer wäre, dass Ihr Arbeitsverzeichnis wiederhergestellt wird, indem Ihr Prozess "wiederhergestellt" wird (im Vordergrund aktiv ist).
Paul Draper
5

Das aktuelle Arbeitsverzeichnis ist lokal für den Prozess. Was Sie wollen, ist also nicht möglich.

vinc17
quelle
1

Sie können auch die CDPATHUmgebungsvariable verwenden. Wie erklärt 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".

So können Sie beispielsweise diese Zeile zu Ihrem hinzufügen ~/.profile:

CDPATH=~/projects

Sie können jetzt cd projectsvon jedem Verzeichnis aus ausführen und zu wechseln ~/projects.

BLIELI
quelle
0

Verwenden Sie dazu den sourceBefehl (alias to .) für die Shell . Die Anwendung wird im Kontext der aktuellen Shell ausgeführt, anstatt einen neuen Shell-Kontext zu erstellen. Auf diese Weise können Sie auch Umgebungsvariablen festlegen. Wenn Sie alle Startskripte in /etc/rc.doder bemerken /etc/init.d, werden viele Skripte angezeigt, die in anderen Skripten mit dem Befehl enthalten sind

. /etc/init.d/rcvars

Das .bewirkt, dass das Skript /etc/init.d/rcvarsso bleibt, dass alles, was es ändert, in der aktuellen Umgebung erhalten bleibt.

Walter
quelle
1
Auf diese Weise können Sie kein C-Programm ausführen, sondern nur ein Shell-Skript.
John Kugelman