chdir (< Verzeichnis >) ' wechselt das Verzeichnis nach dem Beenden in Shell

Ich wollte ein einfaches C -Programm 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 ihn mit folgendem Befehl kompiliert (pro.c ist 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?

Kommentare

  • Sie können stattdessen einen Alias verwenden – alias proj='cd ~/enedil/projects/algo'
  • @MichaelDurrant oh, du meintest cd ~/projects/algo? Es ist eine Idee!
  • Dies ist beabsichtigt!

Antwort

Ihr Programm tut genau das, was Sie ihm sagen: Es ändert das Arbeitsverzeichnis für selbst in /home/enedil/projects/algo. Aber sobald es beendet ist, wird das Arbeitsverzeichnis der Shell wiederhergestellt.

Ich denke, was Sie wollen Um dies zu erreichen, muss das Arbeitsverzeichnis des übergeordneten Prozesses, dh der Shell, geändert werden, ohne auf ein einfaches cd zurückzugreifen. Es gibt a Methode , aber wie der Autor sagt: Tu es nicht.

Kommentare

  • Nitpick, aber die Shell ' wird nicht ' wiederhergestellt, da es sich nie geändert hat. Die Shell ist einfach ein Prozess, genau wie das Programm. Jedes Programm hat das eigene Arbeitsverzeichnis '.
  • @Patrick, true. Konzeptionell genauer wäre Ihr Arbeitsverzeichnis wiederhergestellt, indem Ihr Prozess " wiederhergestellt wird " (is aktiv im Vordergrund).

Antwort

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

Antwort

Sie können auch die CDPATH Umgebungsvariable. Wie in man bash erläutert:

 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". 

Sie können diese Zeile beispielsweise zu Ihrer ~/.profile:

CDPATH=~/projects 

Sie können jetzt cd projects aus einem beliebigen Verzeichnis ausführen und verschieben an ~/projects.

Antwort

Verwenden Sie dazu die für die Shell source Befehl (Alias für .). 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.d oder /etc/init.d bemerken, werden viele Skripte angezeigt, die in anderen Skripten mit dem Befehl enthalten sind

. /etc/init.d/rcvars 

Die . bewirkt, dass das Skript /etc/init.d/rcvars alles Änderungen werden in der aktuellen Umgebung beibehalten.

Kommentare

  • Sie können ' kein C-Programm ausführen Auf diese Weise nur ein Shell-Skript.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.