Bashスクリプト内でPythonを起動しようとすると、スクリプトの実行が停止し、「Python」を呼び出した後にコマンドは実行されません。この簡単な例では、「TESTPRINT」は印刷されません。台本はそこで止まったようでした。
#!/bin/bash
python
print("TESTPRINT")
Echo
Pythonを入力した後でもスクリプトを実行し続けるにはどうすればよいですか?私は数年前に初めてAndroid携帯にシェリングを必要とするスクリプトを書いた後、同じ問題に直面したと思います。どのように解決されたのか覚えていませんね。
答え1
スクリプトで一連の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インタプリタに標準入力からスクリプトを読み取るように指示することです。その後、シェルはEND_SCRIPT
Pythonスクリプトのテキスト(シェルスクリプトで区切られています)をPythonプロセスの標準入力ストリームに送信します。
上記の2つのコードは、2番目のスクリプトのPythonプロセスの標準入力が読み取っているスクリプトにリンクされているのに対して、最初のスクリプトのPythonプロセスはスクリプトの外部の標準入力から自由にデータを読み取ることができる点で若干異なります。 。 Pythonコードが標準入力から読み取られる場合、これは重要です。
Pythonはオプションを使用してコマンドラインから直接コマンドセットをインポートすることもできます-c
。
#!/bin/bash
python -c 'print("TESTPRINT")'
あなたは何ですかできないスクリプトの途中で「Pythonに切り替える」だけですbash
。
スクリプトに含まれるコマンドはbash
順番に実行され、コマンドの実行中にスクリプト自体はそのコマンドが終了するのを待ちます(バックグラウンドジョブではない場合)。
これは、元のスクリプトがインタラクティブモードでPythonを起動し、bash
Pythonプロセスが終了するまでスクリプトの実行を一時的に中断することを意味します。その後、スクリプトはprint("TESTPRINT")
シェルコマンドで実行しようとします。
ssh
スクリプトに似た質問を使用してください。
ssh user@server
cd /tmp
ls
(これは数年前に試したと言ったのと似ています。)
これはいいえリモートシステムに接続し、そこから実行してcd
コマンドを発行しますls
。リモートシステムで対話型シェルを起動し、シェルがシャットダウンするとローカルでcd
実行されます(スクリプトに再度制御を提供します)。ls
代わりに、リモート・システムでコマンドを実行するには、次のようにします。
ssh user@server "cd /tmp; ls"
(これは都合の良い例ですが、おそらく理解できます。)
次の例は、提案を実際に実装する方法を示しています。しかし、いくつかの警告ラベルと警告が付属しています。このようなコードは絶対に書かないでください。(なぜなら汚れてメンテナンスできず、あえて言うとかなり悪いからです。)
python -
print("TESTPRINT")
実行してください:
$ sh -s <script.sh
TESTPRINT
ここで何が起こるのかはスクリプトですsh -s
。 (およびto)オプションは、-s
標準入力ストリームを介して到着するシェルスクリプトを実行するようにシェルに指示します。sh
bash
その後、スクリプトが起動し、python -
次のように通知します。Python標準入力ストリームを介して入ってくるすべてを実行します。ストリームの次のエントリsh -s
はPythonコマンドです。これはPythonから継承されたためです(したがってスクリプトテキストファイルにリンクされています)print("TESTPRINT")
。
その後、Pythonインタプリタは時間が足りなくなるか、Pythonコマンドを実行するまでスクリプトファイルからコマンドを読み続けて実行しますexit()
。
答え2
Kusalanandaの答えに加えて、スクリプト全体をPythonとして実行するには、最初の行を次に変更して通常の#!/usr/bin/env python3
シェルスクリプトのように実行できます。これにより、どのスクリプトを実行するためにどのインタプリタを使用する必要があるかを覚える必要はありません。
答え3
<<<
(Here Strings)演算子を使用して行を保存することもできます。
$ python <<< 'print("MyTest")'
MyTest
答え4
BashスクリプトからPythonファイルを呼び出すときにPythonパスを設定することもできます。
export PYTHONPATH=/tmp/python_dep.zip && python test_my.py