Beim Exportieren einer Funktion, die nicht von allen Shells unterstützt wird, wird der Code in den Umgebungsblock geschrieben. Dies ist ein sprachneutraler Block von Text, der bei der Erstellung eines neuen Prozesses von Parent nach Child kopiert wird.
Dies war die Basis von .
Das Problem ist, dass die beiden Sprachen Bash und Python völlig verschieden sind, so dass eine in einem geschriebene Funktion nicht direkt vom anderen ohne Übersetzung ausführbar ist. Der untergeordnete Prozess könnte den Umgebungsblock nach der Funktion durchsuchen, ihn dann übersetzen und in seine eigene Sprache übersetzen. Eine Menge Arbeit und könnte leicht ein Sicherheitsproblem sein.
Wenn Sie nur Bash-> Python-> Bash gehen wollen, dann sollten Sie die Funktion aus dem ersten Bash-Skript exportieren, da sie in jeden Umgebungsblock kopiert wird. Sie geben jedoch auch in einem Kommentar an, dass das erste Skript es nicht exportieren soll.
Nun, Sie könnte den Funktionscode lesen Python in eine Textzeichenfolge verwenden, dann legen Sie sie in die Umwelt selbst blockieren (das ist, was export
tut in der Schale). Verwenden Sie das os.environ
Wörterbuch.
Der tatsächlich verwendete Name hängt von Ihrer Version von Bash ab. Die ShellShock-Sicherheitslücke hat viele Änderungen zur Folge gehabt. Am besten erstellen Sie eine Testfunktion, exportieren Sie sie und verwenden Sie dann env
, um den vollständigen Namen zu finden. Zum Beispiel erscheint in meiner Version eine einfache Funktion namens gash
im Umgebungsblock als BASH_FUNC_gash%%
.
BASH_FUNC_gash%%=() { echo 'Hollow world'
}
Zum Beispiel:
import os
import subprocess
fun_body="""() { echo 'Hollow world'
}
"""
os.environ['BASH_FUNC_gash%%'] = fun_body
p1 = subprocess.Popen('./myscript.sh')
p1.wait()
Das Skript (myscript.sh
) enthält:
#!/bin/bash
gash
Alternativ Sie wieder auf Ihr Design aussehen könnte. Das Mischen von Sprachen ist immer problematisch. Warum schreiben Sie nicht alles in Python?
Warum nicht 'my_test' -Funktion in einer separaten Shell-Datei speichern und' python -c' mit diesem Shell-Skript-Aufruf von einem anderen ausführen? – vrs
'/ bin/sh' unterstützt das Schlüsselwort' function' nicht. Verwende '#!/Bin/bash' (oder eine andere Shell) für deinen Shebang. – chepner
Darf ich fragen, warum möchten Sie eine Funktion aufrufen, die nur in dieser Shell definiert ist? – nacho4d