Jawaban ini membahas cara menjalankan cuplikan Python multi-baris dari baris perintah di terminal. Saya perhatikan bahwa jawabannya bekerja sangat baik di dalam skrip shell, bahkan dengan lekukan bersarang, yang sangat bagus, misalnya
#!/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
cetakan:
0
hello
hello
1
hello
hello
2
hello
hello
Namun, saya mengalami kesulitan berbagi variabel antara skrip shell dan potongan Python.
Bagaimana saya bisa mengumpulkan output dari skrip python di skrip bash? (misalnya dalam variabel seperti
$output
).Bagaimana saya bisa meneruskan variabel bash (misalnya
$some_text
) ke skrip Python?
python - <<EOF
.Jawaban:
Mendapatkan variabel ke Python
Karena (ketika
EOF
marker tidak dikutip) substitusi variabel terjadi sebelum teks dilewatkan daripython
input standar ke heredoc , Anda dapat melempar variabel ke kanan dalam skrip.Jika
some_text
sudahtest
, python akan melihatsome_text = "test"
. Namun perlu dicatat bahwa ini dapat dilihat sebagai kerentanan injeksi kode. Jikasome_text
itu"; import os; os.system("evil-command"); x = "
, misalnya, python akan melihat:dan jalankan perintah jahat itu.
Jika Anda ingin dapat menarik kode Python langsung ke skrip tanpa modifikasi apa pun, Anda dapat mengekspor variabel Anda.
dan gunakan
os.environ
untuk mengambilnya.Itu pendekatan yang jauh lebih waras / aman.
Mendapatkan output dari Python
Anda dapat menggunakan substitusi perintah untuk mengumpulkan output skrip.
(perhatikan bahwa semua karakter baris baru yang dihapus dihapus)
sumber
"You could also pass the variable to the script as an argument"
, bagaimana Anda melakukannya mengingat skrip Python tertanam dalam skrip shell?print '$SHELL'
, output akan/bin/bash
atau apa pun shell Anda. Jika Anda mengubah baris pertamapython - <<'END'
, hasilnya akan menjadi$SHELL
. Jika Anda menyalin dan menempelkan kode yang ada untuk disematkan ke skrip bash, Anda hampir pasti tidak ingin penggantian shell - Anda ingin kodenya dijalankan dengan cara yang sama ketika tidak disematkan dalam skrip bash, bukan?Masalah dengan pendekatan Anda adalah bahwa skrip python tertanam tidak lagi memiliki akses ke stdin asli (karena stdin adalah ... itu sendiri).
Jika itu masalah Anda bisa menulis:
Atau jika skrip python dapat berisi tanda kutip tunggal:
Atau:
sumber
Gunakan tanda hubung sebagai nama file:
Saya tidak tahu apakah
sys.argv[1:]
ini cara yang tepat untuk melakukan ini dengan Python. Untuk -e / -c Anda bisa menentukan akhir argumen dengan -:Menangkap keluaran dan mengarahkan STDERR:
sumber
1) Anda bisa menulis tugas variabel ke file dengan python, dan kemudian sumber itu dalam skrip bash Anda.
2) Karena kata Anda (EOF) tidak dikutip, semua baris dokumen di sini mengalami ekspansi parameter. Anda dapat menggunakan ini untuk meneruskan barang ke skrip python.
sumber