Tengo un script bash que invoca un script python del que quiero alimentar el contenido a filetravé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 filedado al script bash como stdin al script python main.py.
Tenga en cuenta que filepuede 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.shcomo 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.pycon el contenido del correo en el stdin. Pero la combinación no parece funcionar.
fuente

localLDA de postfix o alguna otra cosa, comoprocmailodeliver? ¿Hay algo en ti~/.bashrcque pueda perturbar el medio ambiente como se vemain.pycuando 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.pyscript está escrito correctamente para leer desde stdin y que nada envenv/bin/activatelecturas 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.pyejecutable 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/activatey 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/stdinhay 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.