シェルスクリプトの混合コード。共有変数

シェルスクリプトの混合コード。共有変数

この回答ターミナルのコマンドラインで複数行のPythonコードを実行する方法について説明します。私は入れ子になったインデントを使用してもシェルスクリプトで答えがうまく機能することがわかりました。

#!/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

しかし、シェルスクリプトとPythonコードスニペット間で変数を共有するのに問題があります。

  1. BashスクリプトからPython添字の出力を収集する方法は? (例:のような変数から$output)。

  2. bash変数(例$some_text:)をPythonスクリプトにどのように渡しますか?

ベストアンサー1

Python変数の取得

EOF(トークンが引用されていない場合)pythonテキストが区切り文字から標準入力に渡される前に変数置換が発生するため、変数をスクリプトに直接投げることができます。

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

もしsome_textそうならtest、Pythonはそれを見るでしょうsome_text = "test"。ただし、これはコード注入の脆弱性と見なされる可能性があることに注意してください。たとえば、some_textwasの場合、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
)

(末尾の改行は削除されます。)

おすすめ記事