J'ai un script bash invoquant un script python dont je veux alimenter le contenu file
via stdin. Appel du script bash comme:
./script.sh < file
Et le contenu de script.sh
:
#! /usr/bin/env bash
pushd /some/python/virtual/environment/working/dir
source venv/bin/activate
python main.py ??????
deactivate
popd
Je ne sais pas quoi remplir pour ??????
passer le contenu de file
given au script bash en tant que stdin au script python main.py
.
Notez qu'il file
peut s'agir d'un fichier texte substantiel et l'utilisation de bash read
n'est pas souhaitable.
L'utilisation de stdin lors de l'appel du script bash est une exigence. Je suis flexible pour passer quoi que ce soit main.py
.
Avez-vous des idées sur la façon de résoudre cette énigme?
une addition
La réponse de @cas m'a fait comprendre que je dois également expliquer dans quel contexte j'essaie d'utiliser script.sh
.
Je veux utiliser script.sh
comme script de transfert dans ~/.forward
, avec le contenu:
|/path/to/script.sh
Quel suffixe appelle comme /path/to/script.sh
; le journal est clair à ce sujet. Un test simple utilisant une version déguisée du script python, comme:
|/path/to/simple/main.py
Montre que postfix appelle main.py
avec le contenu du courrier sur le stdin. Mais la combinaison ne semble pas fonctionner.
la source
local
LDA de postfix ou autre chose, commeprocmail
oudeliver
? y a-t-il quelque chose dans votre maison~/.bashrc
qui pourrait perturber l'environnement tel que vu par lamain.py
course de l'intérieurscript.sh
? peut-être enregistrer l'environnement en exécutant quelque chose comme à l'{ typeset -p ; echo } >> "/tmp/forward.log"
intérieur de script.sh.Réponses:
En supposant que votre
main.py
script est correctement écrit pour lire depuis stdin et que rien dans lesvenv/bin/activate
lectures depuis stdin (*),??????
ne devrait être "rien du tout".Il n'y a aucune commande précédente dans le script bash qui consommera stdin avant python, donc python commencera à le consommer.
Ou rendez
main.py
exécutable et exécutez-le directement car./main.py
... fonctionne de la même façon, dans les deux cas.(*) s'il y en avait, vous ne seriez probablement pas en mesure de le faire, sans quelque chose de laid comme capturer tout stdin dans une variable, puis
<<<
rediriger ou rediriger la variable en premiervenv/bin/activate
et ensuitemain.py
.Pour un exemple très évident de ce qui se passe ici et pourquoi cela fonctionne, considérez le script sh suivant
kitten.sh
:Il s'exécute simplement
cat
, ce qui commence à lire à partir de stdin et à imprimer son entrée sur stdout.la source
/dev/stdin
trouve un fichier de périphérique (ou un lien symbolique vers celui-ci) qui fera la bonne chose lors de la lecture. Le compromis, bien sûr, est que la portabilité est limitée aux systèmes d'exploitation dont vous connaissez les noms spéciaux, par exemple, en affectant une variable locale au faux nom de fichier approprié, puis en utilisant la variable comme argument pourpython main.py
.