前提知識
スクリプトの最初の行の#!で始まるものはshebangと呼ばれる。
スクリプトを書いて、実行するときにシステムによってこの行が読まれ、この実行ファイルで当該スクリプトを実行する機能がLinux系のOSにはある。
pythonで実験
以下のファイルを作成 hello.py
1 |
print('hello') |
実行してみる
1 2 3 4 5 6 7 8 9 10 11 12 |
ebisu@minpsrv ~/T/g$ python3 hello.py hello ebisu@minpsrv ~/T/g$ ./hello.py -bash: ./hello.py: Permission denied ebisu@minpsrv ~/T/g$ chmod +x hello.py ebisu@minpsrv ~/T/g$ ./hello.py ./hello.py: line 1: syntax error near unexpected token `'hello'' ./hello.py: line 1: `print('hello')' ebisu@minpsrv ~/T/g$ bash hello.py hello.py: line 1: syntax error near unexpected token `'hello'' hello.py: line 1: `print('hello')' ebisu@minpsrv ~/T/g$ |
python3を明示式に指定して実行すればちゃんと実行できるが、そうでない場合はbashとして実行されている事がわかる。
ここでshebangを加えてみる。
1 2 |
#! /usr/bin/python3 print('hello') |
実行
1 2 3 4 5 |
ebisu@minpsrv ~/T/g$ python3 hello.py hello ebisu@minpsrv ~/T/g$ ./hello.py hello ebisu@minpsrv ~/T/g$ |
ちゃんと実行できる。
pythonの特殊解釈
しかしpythonのスクリプトではshebangが/usr/bin/python3ではなく、/usr/bin/env python3と記述されている。
/usr/bin/envは引数を起動するだけのプログラムでオプションで環境変数を変更する機能がある。Linuxがこのshebangを読むと/usr/bin/env python3が起動してenvはをPATHなどから探してpython3を実行するものと思われる。
python3ではWindowsとの互換性のために/usr/bin/envがvirtual commandと解され、PATHからpython.exeを見つけるようになるのだと思う。
Windowsの場合は、python.exeの他にpy.exeがシステムディレクトリにインストールされているので、まずpy.exeがスクリプトのshebangを見て適切なpython実行ファイルを探して実行するものと思われる。