Esta resposta discute como executar um trecho de código Python com várias linhas a partir da linha de comando em um terminal. Percebi que a resposta funciona muito bem em scripts shell, mesmo com indentação aninhada, o que é muito bom, por exemplo
#!/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
impressões:
0
hello
hello
1
hello
hello
2
hello
hello
No entanto, estou com dificuldade para compartilhar variáveis entre o shell script e o snippet do Python.
Como posso coletar a saída do subscrito python no script bash? (por exemplo, em uma variável como
$output
).Como posso passar uma variável bash (por exemplo
$some_text
) para o script Python?
python - <<EOF
lugar.Respostas:
Obtendo uma variável para Python
Como (quando o
EOF
marcador não está entre aspas) a substituição da variável ocorre antes que o texto seja passado dapython
entrada padrão do heredoc para a entrada padrão, você pode jogar a variável diretamente no script.Se
some_text
fossetest
, python veriasome_text = "test"
. Observe, no entanto, que isso pode ser visto como uma vulnerabilidade de injeção de código. Sesome_text
fosse"; import os; os.system("evil-command"); x = "
, por exemplo, o python veria:e execute esse comando maligno.
Se você deseja inserir seu código Python em um script sem nenhuma modificação, pode exportar sua variável.
e use
os.environ
para recuperá-lo.Essa é uma abordagem muito mais saudável / segura.
Obtendo saída do Python
Você pode usar a substituição de comandos para coletar a saída do script.
(observe que todos os caracteres de nova linha à direita foram removidos)
fonte
"You could also pass the variable to the script as an argument"
, como você faria isso, considerando que o script Python está incorporado no shell script?print '$SHELL'
, a saída seria/bin/bash
ou seja qual for o seu shell. Se você alterar a primeira linha parapython - <<'END'
, a saída seria$SHELL
. Se você está copiando e colando o código existente para incorporar em um script bash, quase certamente não deseja substituições de shell - você deseja que o código seja executado da mesma maneira que quando não está incorporado em um script bash, certo?O problema com sua abordagem é que o script python incorporado não tem mais acesso ao stdin original (já que o stdin é ... ele próprio).
Se esse é um problema, você pode escrever:
Ou se o script python puder conter aspas simples:
Ou:
fonte
Use um traço como o nome do arquivo:
Não sei se
sys.argv[1:]
é o caminho certo para fazer isso em Python. Para -e / -c, você pode especificar o final dos argumentos com -:Capturando saída e redirecionando STDERR:
fonte
1) Você pode escrever atribuições de variáveis em um arquivo em python e depois originar isso em seu script bash.
2) Como sua palavra (EOF) não é citada, todas as linhas do documento aqui estão sujeitas à expansão de parâmetros. Você pode usar isso para passar coisas para o script python.
fonte