Ich habe ein Bash-Skript, das ein Python-Skript aufruft, dessen Inhalt ich file
über stdin füttern möchte . Rufen Sie das Bash-Skript wie folgt auf:
./script.sh < file
Und der Inhalt von script.sh
:
#! /usr/bin/env bash
pushd /some/python/virtual/environment/working/dir
source venv/bin/activate
python main.py ??????
deactivate
popd
Ich habe keine Ahnung, was ich ausfüllen soll ??????
, um den Inhalt von file
angegeben an das Bash-Skript als Standard an das Python-Skript zu übergeben main.py
.
Beachten Sie, dass file
bash eine wesentliche Textdatei und verwendet werden kann read
ist nicht wünschenswert.
Die Verwendung von stdin beim Aufrufen des Bash-Skripts ist erforderlich. Ich bin flexibel, um alles weiterzugeben main.py
.
Irgendwelche Ideen, wie man dieses Rätsel lösen kann?
Zusatz
Die Antwort von @cas machte mir klar, dass ich auch erklären muss, in welchem Kontext ich versuche zu verwenden script.sh
.
Ich möchte script.sh
als Weiterleitung verwenden in verwenden ~/.forward
, mit dem Inhalt:
|/path/to/script.sh
Welches Postfix heißt /path/to/script.sh
; Das Protokoll ist darüber klar. Ein einfacher Test mit einer verkleideten Version des Python-Skripts, wie:
|/path/to/simple/main.py
Demonstriert, dass Postfix aufruft main.py
mit dem Inhalt der Mail auf dem Standard aufruft. Aber die Kombination scheint nicht zu funktionieren.
quelle
local
LDA von Postfix oder etwas anderes, wieprocmail
oderdeliver
? Gibt es irgendetwas in dir,~/.bashrc
das die Umgebung stören könnte,main.py
wenn du von innenscript.sh
rennst? Vielleicht protokollieren Sie die Umgebung, indem Sie etwas wie{ typeset -p ; echo } >> "/tmp/forward.log"
in script.sh ausführen.Antworten:
Angenommen, Ihr
main.py
Skript ist korrekt geschrieben, um von stdin zu lesen, und nichts invenv/bin/activate
liest von stdin (*),??????
sollte "überhaupt nichts" sein.Es gibt keine vorherigen Befehle im Bash-Skript, die stdin vor Python verbrauchen, daher beginnt Python nur damit, es zu verbrauchen.
Oder machen Sie eine
main.py
ausführbare Datei und führen Sie sie direkt aus, da./main.py
... in beiden Fällen genauso funktioniert.(*) , Wenn es ist, würden Sie wahrscheinlich nicht in der Lage sein , dies überhaupt zu tun, ohne etwas hässlich wie alle stdin auf eine Variable zu erfassen und dann kochend oder
<<<
die Variable in dem ersten Umleitungvenv/bin/activate
und dannmain.py
.Ein sehr offensichtliches Beispiel dafür, was hier passiert und warum dies funktioniert, ist das folgende sh-Skript
kitten.sh
:Es wird nur ausgeführt
cat
, wobei von stdin aus gelesen und die Eingabe in stdout gedruckt wird.quelle
/dev/stdin
Varianten befindet sich beispielsweise eine Gerätedatei (oder ein Symlink zu einer solchen), die beim Lesen das Richtige tut. Der Nachteil ist natürlich, dass die Portabilität auf die Betriebssysteme beschränkt ist, deren spezielle Namen Sie kennen, z. B. indem Sie dem entsprechenden gefälschten Dateinamen eine lokale Variable zuweisen und dann die Variable als Argument verwendenpython main.py
.