普段 Windows 上で作業しているといっても、実際は cygwin の端末の中でちくちくしているわけだ。
一方で、Windows 向けの PHP をインストールもしている。そうすると cygwin の中から PHP スクリプトを呼び出したくなる時もある。どうすればいいだろうか。
純 Windows 環境側の path 環境変数で、すでに php.exe にはパスを通してある。また cygwin は起動時にその path を継承するので、とりあえず cygwin 上で
$ php -f C:\path\to\script
というのはできる。次に shebang を通して実行させたい。つまり #!/usr/bin/php
と 1 行目に書いた php スクリプトを実行させたい。
うちの環境では、cygwin 上の php.exe の位置は [cci]/cygdrive/c/Program Files (x86)/php/current/php.exe[/cci] だ。そこでまず、コマンドプロンプトで > cd C:\cygwin\bin
などとしてみた: 失敗。Windows では実行形式を指すシンボリックリンクを実行したとき、argv[0] が真の実行形式ファイルを差さないようだ。それはシンボリックファイルを指したままだ。だから、実行形式を指すシンボリックリンクを実行した場合、実行形式の存在するディレクトリを起点にして設定ファイルを読み込んだりする処理はことごとく失敗する。うちの環境の php の場合、php.exe の隣においてある php.ini が読み込まれない。
> mklink php.exe "C:\Program Files (x86)\php\current\php.exe"
そういうわけで /usr/bin/php として
#!/bin/sh
exec "/cygdrive/c/Program Files (x86)/php/current/php.exe" "$@"
てな感じのシェルスクリプトを置くと動く。
また、php スクリプト側を
#!/usr/bin/env php
としてもいい。あんまりこの env のトリック好きじゃないけど、実質的にはいちばん楽かなー。