Cette réponse explique comment exécuter un extrait de code Python sur plusieurs lignes à partir de la ligne de commande dans un terminal. J'ai remarqué que la réponse fonctionne très bien dans les scripts shell, même avec une indentation imbriquée, ce qui est très bien, par exemple
#!/bin/bash
some_text="Hello world"
echo $some_text
cat <<EOF | python -
import sys;
for r in range(3):
print r
for a in range(2):
print "hello"
EOF
impressions:
0
hello
hello
1
hello
hello
2
hello
hello
Cependant, j'ai du mal à partager des variables entre le script shell et l'extrait de code Python.
Comment puis-je collecter la sortie de l'indice python dans le script bash? (par exemple dans une variable telle que
$output
).Comment puis-je passer une variable bash (par exemple
$some_text
) au script Python?
python - <<EOF
place.Réponses:
Obtenir une variable pour Python
Puisque (lorsque le
EOF
marqueur n'est pas cité) la substitution de variable se produit avant que le texte ne soit passé de l'hérédoc àpython
l'entrée standard de, vous pouvez lancer la variable directement dans le script.Si
some_text
c'était le castest
, python verraitsome_text = "test"
. Notez cependant qu'il peut être vu comme une vulnérabilité d'injection de code. Sisome_text
était"; import os; os.system("evil-command"); x = "
, par exemple, python verrait:et exécutez ce mauvais commandement.
Si vous voulez pouvoir extraire votre code Python directement dans un script sans aucune modification, vous pouvez exporter votre variable.
et utilisez-le
os.environ
pour le récupérer.C'est une approche beaucoup plus saine / sûre.
Obtenir la sortie de Python
Vous pouvez utiliser la substitution de commandes pour collecter la sortie du script.
(notez que tous les caractères de fin de ligne sont supprimés)
la source
"You could also pass the variable to the script as an argument"
, comment feriez-vous cela étant donné que le script Python est intégré dans le script shell?print '$SHELL'
, la sortie serait/bin/bash
ou quoi que soit votre shell. Si vous changez la première ligne enpython - <<'END'
, la sortie serait$SHELL
. Si vous copiez et collez du code existant pour l'incorporer dans un script bash, vous ne voulez certainement pas de substitutions de shell - vous voulez que le code s'exécute de la même manière qu'il n'est pas incorporé dans un script bash, non?Le problème avec votre approche est que le script python intégré n'a plus accès au stdin d'origine (puisque son stdin est ... lui-même).
Si c'est un problème, vous pouvez écrire:
Ou si le script python peut contenir des guillemets simples:
Ou:
la source
Utilisez un tiret comme nom de fichier:
Je ne sais pas si
sys.argv[1:]
c'est la bonne façon de le faire en Python. Pour -e / -c, vous pouvez spécifier la fin des arguments avec -:Capture de sortie et redirection de STDERR:
la source
1) Vous pouvez écrire des affectations de variables dans un fichier en python, puis les sourcez dans votre script bash.
2) Puisque votre mot (EOF) n'est pas cité, toutes les lignes du document ici sont soumises à une expansion des paramètres. Vous pouvez l'utiliser pour transmettre des éléments au script python.
la source