Eu tenho um script bash chamando um script python do qual desejo alimentar o conteúdo file
via stdin. Chamando o script bash como:
./script.sh < file
E o conteúdo de script.sh
:
#! /usr/bin/env bash
pushd /some/python/virtual/environment/working/dir
source venv/bin/activate
python main.py ??????
deactivate
popd
Eu não tenho idéia do que preencher para ??????
passar o conteúdo do file
dado para o script bash como stdin para o script python main.py
.
Observe que file
pode ser um arquivo de texto substancial e o uso do bash nãoread
é desejável.
Usar stdin ao chamar o script bash é um requisito. Sou flexível para passar o que quer que seja main.py
.
Alguma idéia lá fora, como lidar com esse enigma?
Adição
A resposta do @cas deixou claro para mim que também preciso explicar em que contexto tento usar script.sh
.
Quero usar script.sh
como um script de encaminhamento~/.forward
, com o conteúdo:
|/path/to/script.sh
Qual postfix chama como /path/to/script.sh
; o log é claro sobre isso. Um teste simples usando uma versão simplificada do script python, como:
|/path/to/simple/main.py
Demonstra que o postfix chama main.py
com o conteúdo do email no stdin. Mas a combinação não parece funcionar.
fonte
local
LDA do postfix ou algo mais, comoprocmail
oudeliver
? existe algo no seu~/.bashrc
que possa perturbar o meio ambiente, vistomain.py
quando executado a partir de dentroscript.sh
? talvez registre o ambiente executando algo como{ typeset -p ; echo } >> "/tmp/forward.log"
dentro do script.sh.Respostas:
Supondo que seu
main.py
script esteja corretamente escrito para ler a partir de stdin e que nada nasvenv/bin/activate
leituras de stdin (*),??????
seja "nada".Não há comandos anteriores no script bash que consumirão stdin antes do python, portanto, o python começará a consumi-lo.
Ou torne o
main.py
executável e execute-o diretamente, pois./main.py
... funciona da mesma maneira.(*) se houvesse, você provavelmente não seria capaz de fazer isso, sem algo feio como capturar todo o stdin em uma variável e, em seguida, canalizar ou
<<<
redirecionar a variável para a primeiravenv/bin/activate
e depoismain.py
.Para um exemplo muito óbvio do que está acontecendo aqui e por que isso funciona, considere o seguinte script sh
kitten.sh
:É executado
cat
, o que começa a ler do stdin e a imprimir sua entrada no stdout.fonte
/dev/stdin
há um arquivo de dispositivo (ou um link simbólico para tal) que fará a coisa certa quando lida. A desvantagem, é claro, é que a portabilidade é limitada aos sistemas operacionais cujos nomes especiais você conhece, por exemplo, atribuindo uma variável local ao nome de arquivo falso apropriado e, em seguida, usando a variável como argumento parapython main.py
.