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.