Bash
shell 腳本中的混合程式碼。共享變數
這個答案討論瞭如何從終端的命令行執行多行 Python 片段。我注意到答案在 shell 腳本中效果很好,即使有嵌套縮進,這非常好,例如
#!/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
印刷:
0 hello hello 1 hello hello 2 hello hello
但是,我很難在 shell 腳本和 Python 片段之間共享變數。
- 如何在 bash 腳本中收集 python 下標的輸出?(例如在變數中,例如
$output
)。- 如何將 bash 變數(例如
$some_text
)傳遞給 Python 腳本?
獲取 Python 變數
由於(當
EOF
不引用標記時)變數替換發生在文本從 heredoc 傳遞到python
的標準輸入之前,因此您可以將變數直接放入腳本中。python - <<EOF some_text = "$some_text" EOF
如果
some_text
是test
,python 會看到some_text = "test"
. 但是請注意,它可以被視為程式碼注入漏洞。例如,如果some_text
是,python 會看到:"; import os; os.system("evil-command"); x = "
some_text = ""; import os; os.system("evil-command"); x = ""
並執行那個邪惡的命令。
如果您希望能夠在不進行任何修改的情況下將 Python 程式碼直接提取到腳本中,則可以導出變數。
export some_text
並用於
os.environ
檢索它。some_text = os.environ['some_text']
這是一種更理智/更安全的方法。
從 Python 獲取輸出
您可以使用命令替換來收集腳本的輸出。
output=$( python - <<EOF import sys; for r in range(3): print r for a in range(2): print "hello" EOF )
(請注意,所有尾隨換行符都被刪除)