Ich möchte Code schreiben, damit ich zu einigen Verzeichnissen wechseln kann, in die ich normalerweise gehe. Angenommen, dieses Programm ist mycd
und /a/very/long/path/name
ist das Verzeichnis, in das ich gehen möchte.
So kann ich geben Sie einfach mycd 2
statt cd /a/very/long/path/name
. Hier gehe ich davon mycd
weiß , 2
bezieht sich auf das /a/very/long/path/name
. Es könnte auch sein mycd 1
, mycd 3
... usw.
Das Problem ist, dass ich mycd
als Shell-Skript schreiben und eingeben muss . mycd 2
, um das gewünschte Ziel zu erreichen, da das Skript sonst nur in einem untergeordneten Skript ausgeführt wird, das nichts an der übergeordneten Shell ändert, die mir wirklich wichtig ist.
Meine Frage ist:
kann ich es ohne verwenden
source
? weil. mycd
davon ausgegangenmycd
wird, dass es sich um ein Shell-Skript handeln muss und dies möglicherweise auch einige Funktionen einführt, die ich nicht möchte.Kann ich es in einigen anderen Programmiersprachen implementieren?
quelle
mycd
passieren$@
zu jedem Programm , die ich mag."$@"
damit alle Argumente, die Leerzeichen enthalten, korrekt behandelt werden.Sie können das aktuelle Verzeichnis einer Shell nicht von einem anderen Prozess ändern. Nur der Prozess selbst kann sein eigenes aktuelles Verzeichnis ändern. Dies gilt auch für einige andere Merkmale wie Umgebungsvariablen und Dateideskriptoren.
Es ist tatsächlich möglich, das aktuelle Verzeichnis eines anderen Prozesses zu beeinflussen, indem ein
chdir
Systemaufruf über denptrace
Systemaufruf ausgeführt wird, wodurch Debugger arbeiten können. Wenn der Prozess jedoch einige interne Datenstrukturen verwaltet, die mit dem aktuellen Verzeichnis übereinstimmen müssen, stürzt das Programm wahrscheinlich ab. Für eine Shell hat dieser Ansatz keine Chance zu funktionieren.Sie müssen dafür sorgen, dass Ihr Code von der Shell selbst ausgeführt wird. Die normale Vorgehensweise wäre, es zu einer Shell-Funktion zu machen und in Ihrer zu speichern
~/.bashrc
. Wenn dies nicht möglich ist, z. B. weil Sie Code verteilen möchten, schreiben Sie eine Shell-Quelldatei, die die Funktionsdefinition enthält, und weisen Sie die Benutzer an, ihre Datei mit dem.
Befehl von ihrer interaktiven Shell lesen zu lassen .quelle
ws=$1; gdb -p $(ps h -o ppid -p $$) -ex "call chdir(\"$wd\")" -ex "call set_working_directory(\"$wd\")" -ex detach -ex q -batch
. Ausführen alsbraindead-cd-parent /
. Sie werden sehen, dass sichpwd
Rückkehr/
undls
Verhalten usw. verhalten. Aber die Eingabeaufforderung (PS1
) bleibt unverändert, die Augen der Menschen sind verletzt usw. Tun Sie dies also nicht, auch wenn dies möglich ist.ptrace
Methode, die ich erwähne. Es funktioniert gut bei Programmen, denen das aktuelle Verzeichnis egal ist. In einer Shell werden viele Dinge (PWD
Variable, Eingabeaufforderung usw.) falsch sein, und die Shell kann abstürzen oder sich auf andere Weise schlecht verhalten.Wie Sie selbst betont haben, werden Shell-Skripte immer in einer Subshell ausgeführt, die die übergeordnete Shell nicht beeinflussen kann.
Sie können jedoch ...
alias mycd2='cd /a/very/long/path/name'
Lassen Sie Ihr Skript 1 einen gültigen Shell-Befehl ausgeben ...
... und seine Ausgabe ausführen:
$(mycd 2)
1: Sie möchten wahrscheinlich
case
eher eine Anweisung als dieif
Bedingung im Beispiel verwenden.quelle