Tengo un script bash que invoca un script python del que quiero alimentar el contenido a file
través de stdin. Llamando al script bash como:
./script.sh < file
Y los contenidos de script.sh
:
#! /usr/bin/env bash
pushd /some/python/virtual/environment/working/dir
source venv/bin/activate
python main.py ??????
deactivate
popd
No tengo idea de qué llenar para ??????
pasar el contenido de file
dado al script bash como stdin al script python main.py
.
Tenga en cuenta que file
puede ser un archivo de texto sustancial y noread
es deseable usar bash .
Usar stdin al invocar el script bash es un requisito. Soy flexible para pasar lo que sea main.py
.
¿Alguna idea sobre cómo abordar este enigma?
adición
La respuesta de @cas me dejó claro que también necesito explicar en qué contexto trato de usar script.sh
.
Quiero usar script.sh
como script de reenvío~/.forward
, con el contenido:
|/path/to/script.sh
Qué postfix llama como /path/to/script.sh
; el registro es claro al respecto. Una prueba simple con una versión reducida del script de Python, como:
|/path/to/simple/main.py
Demuestra que postfix llama main.py
con el contenido del correo en el stdin. Pero la combinación no parece funcionar.
fuente
local
LDA de postfix o alguna otra cosa, comoprocmail
odeliver
? ¿Hay algo en ti~/.bashrc
que pueda perturbar el medio ambiente como se vemain.py
cuando se ejecuta desde dentroscript.sh
? tal vez registre el entorno ejecutando algo como{ typeset -p ; echo } >> "/tmp/forward.log"
dentro de script.sh.Respuestas:
Asumiendo que su
main.py
script está escrito correctamente para leer desde stdin y que nada envenv/bin/activate
lecturas de stdin (*),??????
debería ser "nada en absoluto".No hay comandos anteriores en el script bash que consuman stdin antes de python, por lo que python comenzará a consumirlo.
O haga
main.py
ejecutable y ejecútelo directamente como./main.py
... funciona igual, de cualquier manera.(*) si lo hubiera, probablemente no sería capaz de hacer esto en absoluto, sin algo feo como capturar todo el stdin en una variable y luego canalizar o
<<<
redirigir la variable primerovenv/bin/activate
y luegomain.py
.Para un ejemplo muy obvio de lo que está sucediendo aquí y por qué esto funciona, considere el siguiente script sh
kitten.sh
:Simplemente se ejecuta
cat
, que comienza a leer desde stdin e imprime su entrada en stdout.fuente
/dev/stdin
hay un archivo de dispositivo (o un enlace simbólico a ese) que hará lo correcto cuando se lea. La desventaja, por supuesto, es que la portabilidad se limita a los sistemas operativos cuyos nombres especiales conoces, por ejemplo, asignar una variable local al nombre de archivo falso apropiado y luego usar la variable como argumento parapython main.py
.