Bash

shell 腳本中的混合程式碼。共享變數

  • May 25, 2016

這個答案討論瞭如何從終端的命令行執行多行 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 片段之間共享變數。

  1. 如何在 bash 腳本中收集 python 下標的輸出?(例如在變數中,例如$output)。
  2. 如何將 bash 變數(例如$some_text)傳遞給 Python 腳本?

獲取 Python 變數

由於(當EOF不引用標記時)變數替換發生在文本從 heredoc 傳遞到python的標準輸入之前,因此您可以將變數直接放入腳本中。

python - <<EOF
some_text = "$some_text"
EOF

如果some_texttest,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
)

(請注意,所有尾隨換行符都被刪除)

引用自:https://unix.stackexchange.com/questions/74244