すべてのシェルでサポートされていない関数をエクスポートすると、コードが環境ブロックに配置されます。これは言語に依存しないブロックテキストで、新しいプロセスが作成されたときに親から子にコピーされます。
これはShellShockの基礎となりました。
BashとPythonの2つの言語が全く異なるため、翻訳されていない関数が直接実行することはできません。子プロセスは、環境ブロックをスキャンして関数を探し、それを翻訳してそれ自身の言語にコンパイルすることができます。仕事の多くは、簡単にセキュリティの問題になる可能性があります。
Bash-> Python-> Bashに行きたい場合は、各環境ブロックにコピーされるので、最初のBashスクリプトから関数をエクスポートする必要があります。しかし、コメントでは、最初のスクリプトでエクスポートする必要がないと述べています。
さてあなたは(これはexport
は、シェルで何をするかである)自分をブロックし、環境に入れて、その後、テキスト文字列にパイソンを使用した機能コードを読むことができました。 os.environ
辞書を使用してください。
使用される実際の名前は、使用しているBashのバージョンによって異なります。 ShellShockの脆弱性は多くの変更をもたらしました。テスト関数を作成してエクスポートし、env
を使用してそのフルネームを見つけるのが最適です。たとえば、私のバージョンでは、gash
という単純な関数が、環境ブロック内にBASH_FUNC_gash%%
と表示されます。例えば
BASH_FUNC_gash%%=() { echo 'Hollow world'
}
:
import os
import subprocess
fun_body="""() { echo 'Hollow world'
}
"""
os.environ['BASH_FUNC_gash%%'] = fun_body
p1 = subprocess.Popen('./myscript.sh')
p1.wait()
スクリプト(myscript.sh
)が含まれています
#!/bin/bash
gash
また、あなたがもう一度あなたのデザインを見ることができます。言語を混在させるのはいつも問題なので、Pythonでたくさん書く必要はないのですか?
'my_test'関数を別のシェルファイルに保存して、別のシェルスクリプト呼び出しで' python -c'を実行してみませんか? – vrs
'/ bin/sh'は' function'キーワードをサポートしていません。あなたのシバンに '#!/ bin/bash'(または他のシェル)を使用してください。 – chepner
なぜ、そのシェルでのみ定義された関数を呼びたいのですか? – nacho4d