質問: bashスクリプトでpythonを使用する bashスクリプトでpython=を開始しようとすると、スクリプトが実行を停止し、「python」が呼び出された後にコマンドが実行されません。この簡単な例では、「testprint」は印刷されません。スクリプトが停止したようです。#!/bin/bash python print("testprint") echo pythonに移行した後もスクリプトを実行し続けるにはどうすればよいですか?最初にandroid phoneにシェル化する必要があったスクリプトを書いた後、数年前に同じ問題があったと思います。そのときどのように修正したか思い出せません。
回答: 一連のpythonコマンドをbashスクリプトから実行するには、pythonインタープリターに実行するコマンドをファイルから与える必要があります。 (pythonスクリプト)次のようにスクリプトで作成します#!/bin/bash -e # create script as "script.py" cat >script.py <<'end_script' print("testprint") end_script # run script.py python script.py rm script.py (これにより、script.pyという新しいファイルが作成されるか、既に存在する場合はそのファイルが上書きされ、pythonに実行するように指示されます。その後、削除されます)...または、ヒアドキュメントなど、何らかのリダイレクトを介して直接:#!/bin/bash python - <<'end_script' print("testprint") end_script これはpython -を実行して、pythonインタープリターに標準入力からスクリプトを読み取るように指示します。次に、シェルはpythonスクリプトのテキストを送信します(シェルスクリプトのend_script)をpythonプロセスの標準入力ストリームに追加します。上記のコードの2つのビットは微妙に異なり、2番目のスクリプトのpythonプロセスは、読み込んでいるスクリプトに接続されている標準入力を持っていますが、最初のスクリプトはpythonプロセスは、スクリプト以外のデータを標準入力から自由に読み取ることができます。これは、pythonコードが標準入力から読み取る場合に重要です。pythonは、コマンドラインから-cオプションを使用して、一連のコマンドを直接取得することもできます。#!/bin/bash python -c 'print("testprint")' できないは、bashスクリプトの途中で「pythonに切り替える」ことです。スクリプト内のコマンドはbashによって次々に実行され、コマンドの実行中、スクリプト自体はそれが終了するのを待ちます(バックグラウンドジョブでない場合)。つまり、元のスクリプトはpythonインタラクティブモードで開始し、bashスクリプトの実行をpythonプロセスが終了するまで一時的に中断します。その後、スクリプトはprint("testprint")をシェルコマンドとして実行しようとします。これは、スクリプトで次のようにsshを使用する場合の同様の問題です。ssh user@server cd /tmp ls (おそらく、数年前に試したことと同じかもしれません)。これはnotリモートシステムに接続し、そこでcdおよびlsコマンドを実行します。リモートシステムで対話型シェルを開始し、そのシェルが終了すると(スクリプトに制御を戻します)、cdおよびlsがローカルで実行されます。代わりに、リモートマシンでコマンドを実行するには、次のコマンドを使用します。ssh user@server "cd /tmp; ls" (これは不十分な例ですが、要点を理解することができます)。以下の例は、提案したことを実際に行う方法を示しています。ただし、いくつかの警告ラベルと警告が付いていますそして、このようなコードは絶対に作成しないでください(難読化されているため、メンテナンスが困難であり、あえて言うと、それはまったく悪いことです)。python - print("testprint") それを実行する:$ sh -s <script.sh testprint ここで何が起きるかは、スクリプトがsh -sによって実行されていることです。 sh(およびbash)の-sオプションは、標準入力ストリーム経由で到着するシェルスクリプトを実行するようにシェルに指示します。次に、スクリプトはpython -を開始します。これは、pythonに、標準入力ストリームから受け取ったものを実行するように指示します。 python(したがって、スクリプトテキストファイルに接続されている)によってsh -sから継承されているため、そのストリームの次は、python command print("testprint")。pythonインタープリターは、スクリプトファイルからコマンドを読み取り、実行するまで、pythonコマンドexit()が実行されるまで実行し続けます。