web-dev-qa-db-ja.com

シェルスクリプトのハイブリッドコード。変数の共有

この回答 は、ターミナルでコマンドラインから複数行を実行する方法を説明しています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. python添え字の出力をどのように収集できますか?(例:$outputなどの変数))。

  2. Pythonスクリプトにbash変数($some_textなど)を渡すにはどうすればよいですか?

10

Pythonへの変数の取得

EOFマーカーが引用符で囲まれていない場合)変数の置換は、テキストがheredocからpythonの標準入力に渡される前に行われるため、スクリプト内で変数を直接スローできます。

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

some_texttestの場合、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
)

(末尾の改行文字はすべて削除されることに注意してください)

12
user26112

あなたのアプローチの問題は、埋め込まれた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
)
8

ファイル名としてダッシュを使用します。

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
)
6
Lri

1)Pythonでファイルに変数の割り当てを記述し、それをbashスクリプトで読み込むことができます。

2)Word(EOF)は引用されていないため、ヒアドキュメントのすべての行がパラメータ展開されます。これを使用して、pythonスクリプトにデータを渡すことができます。

2
Roland Smith