この回答 は、ターミナルでコマンドラインから複数行を実行する方法を説明しています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スニペットの間で変数を共有するのに苦労しています。
python添え字の出力をどのように収集できますか?(例:$output
などの変数))。
Pythonスクリプトにbash変数($some_text
など)を渡すにはどうすればよいですか?
Pythonへの変数の取得
(EOF
マーカーが引用符で囲まれていない場合)変数の置換は、テキストがheredocからpython
の標準入力に渡される前に行われるため、スクリプト内で変数を直接スローできます。
python - <<EOF
some_text = "$some_text"
EOF
some_text
がtest
の場合、pythonはsome_text = "test"
を表示します。ただし、コードインジェクションの脆弱性と見なされる可能性があります。たとえば、some_text
が"; import os; os.system("evil-command"); x = "
の場合、 、pythonは次のようになります:
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
)
(末尾の改行文字はすべて削除されることに注意してください)
あなたのアプローチの問題は、埋め込まれたpythonスクリプトが、元のstdinにアクセスできなくなったことです(そのstdinは...なので)。
それが問題なら、あなたは書くことができます:
python -c '
import sys;
for r in range(3):
print r
for a in range(2):
print "hello"
'
または、pythonスクリプトに単一引用符が含まれる場合があります。
python -c "$(cat << 'EOF'
import sys;
for r in range(3):
print r
for a in range(2):
print "hello"
EOF
)"
または:
python <(cat << 'EOF'
import sys;
for r in range(3):
print r
for a in range(2):
print "hello"
EOF
)
ファイル名としてダッシュを使用します。
Ruby - a b <<'END'
puts ARGV.join(",")
END
python - a b <<'END'
import sys
print ",".join(sys.argv[1:])
END
sys.argv[1:]
がPythonでこれを行う正しい方法であるかどうかわかりません。 -e/-cの場合、引数の終わりを-で指定できます。
set -- -a -b -c
Ruby -e 'puts ARGV.join(",")' -- "$@"
python -c 'import sys; print ",".join(sys.argv[2:])' -- "$@"
出力のキャプチャとSTDERRのリダイレクト:
x=$(Ruby <<'END' 2> /dev/null
puts "a"
abort "b"
END
)
1)Pythonでファイルに変数の割り当てを記述し、それをbashスクリプトで読み込むことができます。
2)Word(EOF)は引用されていないため、ヒアドキュメントのすべての行がパラメータ展開されます。これを使用して、pythonスクリプトにデータを渡すことができます。