Ich schreibe ein Python-Skript (Linux), das einige Shell-Aliase hinzufügt (schreibt sie in HOME/.bash_aliases
) .
Um einen Alias unmittelbar nach dem Schreiben verfügbar zu machen, sollte ich die folgende Bash-Funktion ausgeben:
%Vor% source
ist eine eingebaute Bash, also kann ich nicht einfach:
Wenn ich etwas wie:
versuche %Vor%... wird das Skript einfrieren (genau wie es auf etwas wartet).
Irgendwelche Vorschläge?
Was Sie wollen, ist nicht möglich. Ein Programm (Ihr Skript) kann die Umgebung des Aufrufers (der Shell, von der Sie es ausführen) nicht ändern.
Ein anderer Ansatz, der es Ihnen erlaubt, etwas in der Nähe zu tun, besteht darin, es in eine bash-Funktion zu schreiben, die im selben Prozess ausgeführt wird und den Aufrufer ändern kann. Beachten Sie, dass das Sourcing während der Laufzeit möglicherweise negative Nebenwirkungen haben kann, je nachdem, was der Benutzer in seinem bashrc hat.
Was Sie versuchen, ist unmöglich. oder besser: wie Sie es versuchen ist unmöglich.
Ihr Bash-Befehl ist falsch. bash -s command
führt command
nicht aus. Es speichert nur den String "command" in der Variable und lässt Sie dann zur Eingabeaufforderung fallen. Deshalb scheint das Python-Skript einzufrieren. Was Sie tun wollten, ist
bash -c command
.
Warum beziehen Sie .bashrc
? Wäre es nicht genug, nur .bash_aliases
zu finden?
Auch wenn Sie Ihren bash-Befehl richtig verstanden haben, werden die Änderungen nur in der von python gestarteten Bash-Sitzung wirksam. Sobald diese Bash-Sitzung beendet ist und Ihr Python-Skript fertig ist, sind Sie wieder bei Ihrer ursprünglichen Bash-Sitzung. Alle Änderungen in der Bash-Sitzung, die mit Python begonnen wurde, gehen verloren.
Jedes Mal, wenn Sie etwas in der aktuellen Bash-Sitzung ändern möchten, müssen Sie dies innerhalb der aktuellen Bash-Sitzung tun. Die meisten Befehle, die Sie von bash aus ausführen (Systembefehle, Python-Skripte, sogar Bash-Skripte) erzeugen einen anderen Prozess, und alles, was Sie in diesem anderen Prozess tun, wird Ihre erste Bash-Sitzung nicht beeinflussen.
source
ist ein Bash-Built-in, mit dem Sie Befehle innerhalb der aktuell laufenden Bash-Sitzung ausführen können, anstatt einen anderen Prozess zu erzeugen und die Befehle dort auszuführen. Das Definieren einer Bash-Funktion ist eine andere Möglichkeit, Befehle innerhalb der aktuell laufenden Bash-Sitzung auszuführen.
Siehe diese Antwort für weitere Informationen zum Sourcing und zur Ausführung.
Ändern Sie Ihr Python-Skript, um nur die notwendigen Änderungen an .bash_aliases
vorzunehmen.
Bereiten Sie ein Bash-Skript vor, um Ihr Python-Skript auszuführen, und geben Sie dann .bash_aliases
an.
Fügen Sie Ihrem .bashrc
einen Alias hinzu, um das Skript zu erhalten
Wenn Sie nun add_alias some_alias
in Ihre Bash-Eingabeaufforderung eingeben, wird sie durch source modify_bash_aliases.sh
ersetzt und dann ausgeführt. Da source
eine Bash-Datei ist, werden die Befehle innerhalb des Skripts innerhalb der aktuell laufenden Bash-Sitzung ausgeführt. Das Python-Skript wird weiterhin in einem anderen Prozess ausgeführt, aber der nachfolgende Befehl source
wird in der aktuell ausgeführten Bash-Sitzung ausgeführt.
Ändern Sie Ihr Python-Skript, um nur die notwendigen Änderungen an .bash_aliases
vorzunehmen.
Bereiten Sie eine bash-Funktion vor, um Ihr Python-Skript auszuführen, und geben Sie dann .bash_aliases
an.
Jetzt können Sie die Funktion wie folgt aufrufen: add_alias some_alias
[[funktionierende Lösung]]
http://stackoverflow.com/questions/6856119/can-i-use-an-alias-to-execute-a-program-from-a-python-script
Ich hatte ein interessantes Problem, bei dem ich eine RC-Datei verwenden musste, um die korrekte Ausgabe in meinem Python-Skript zu erhalten.
Ich habe das schließlich in meiner Funktion verwendet, um die gleichen Variablen aus der Bash-Datei zu holen, die ich für die Quelle brauchte. Stellen Sie sicher, dass Sie os importiert haben.
%Vor%