- ベストアンサー
SSIの『#exec cmd』と『#exec cgi』の違いがよくわかりません
SSI初心者の者です。 参考書(CGIプログラミング入門/翔泳社)を見ながらCGIとSSIの勉強をしてるのですが、SSIの『#exec cmd』と『#exec cgi』の違いがよくわかりません。 本には前者はPerlスクリプトで後者はCGIスクリプトの場合に使うって書いてあるのですが、この2つってどう違うのですか? 前後の文脈から察するにCGIスクリプトは『print "Content-Type: text/html"』があって、 Perlスクリプトはこれが無いものと読み取れるのですが そうなのでしょうか? 初心者向けに御回答していただけますよう、よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
補足受けましたhyde-laです 結論から言いますと、無視されるようなことはありません。 飽くまで「結果」をどう扱うかという話ですので。 この場合の結果とは、プログラムの標準出力へ出力されたものという意味です。 #EXEC CMDでは、プログラムの「標準出力」を結果としてブラウザに表示するだけです。 UNIXやDOS等、多くの環境には「標準出力」という考え方があります。 これはPRINT文などで出力される場所で、つまりデフォルトでは画面です。 (標準出力はリダイレクトという操作を用いて、出力先を変えることが出来ます)
その他の回答 (2)
- hyde-la
- ベストアンサー率28% (42/146)
SSIは基本的に「コマンドを実行してその結果を返す」ためのものです。 ですから、 #exec cmdの場合だと「これはブラウザに結果を返しますよ」 という前提の下で結果が処理されますので、正常に出力されます。 しかし#exec cgiでは、既に「CGIとしてブラウザに結果を 返します」なので CGIの中でTmaさんのおっしゃるようにヘッダをPRINTしてやらないと 平常に出力されなくなってしまいます。 ですから、ちゃんとしたCGIを呼び出す時はCGI=""で。 CGI以外のコマンドで、代用のために呼び出すならCMD=""で。 実際にSSIを使える環境にあるなら、以下を試してみてください。 <!-- #exec cmd="ls" --> <!-- #exec cgi="ls" --> サーバー上のディレクトリ一覧が正常に表示されたのは どちらでしょうか? 仕様通りなら、上のものが正常に出力されるはずです。
お礼
お応えいただきありがとうございました。 Tmaさんの回答と併せてよく拝読しましたら より理解が深まりました。 ただ、ふと思うのですが、#exec cmdの場合は 『ブラウザに表示させる』ことを前提にしてるからには print や ls などの表示系のコマンドしか受け付け ないのでしょうか? たとえば、ファイル操作系の命令↓ open(IN,">name.txt"); print IN "T.Suzuki"; close(IN); は無視されてしまうのでしょうか? 私の持ってる本では訪問者カウンターを作るときに #exec cmdを使って上記の様なファイル操作の命令を 行ってるのでできそうな感じなのですが、実際私が 試してみたらできませんでした。 今のところ原因はわかりませんが、もしかしたら #exec cmdではファイル操作の命令はできないのだろう か?と思った次第です。でも、本にはできるって書いて あるし・・・。若干混乱してきてます。
- Tma
- ベストアンサー率48% (13/27)
後者の「#exex cgi」は CGI として起動することとですが 前者の「#exrc cmd」は command の cmd だったはずです。 なので exec cmd はそこからシェルスクリプトを起動できるのと exec cgi はそのスクリプトを起動するだけの違いだったと思います。 ただ、「print "Content-Type: text/html\n\n」は HTML のコンテントタイプを指定しているもので 前者の command ではシェルスクリプト起動であるため そのままの結果が表示されるので HTML コンテントタイプが不要で、 後者の CGI ではコンテントタイプを指定する必要があるからだと思います。 通常の CGI を Perl などで使ったことがあるのであれば わかるかと思いますが、CGI として起動したものを WWW ブラウザに HTML ファイルと教えるには "Content-Type: text/html\n\n"という記述が必要だと わかるかと思います。
お礼
お応えいただき、どうもありがとうございます。 UNIXもわからないのでシェルスクリプト といわれてもイマイチピンと来ないのですが、 cmdの場合はブラウザに結果を表示するために あり、cgiはブラウザに表示させることは 前提としていないから"Content-Type: text/html\n\n" が必要なんですね。 ありがとうございました。m(__)m
お礼
再度、御回答いただき誠にありがとうございます。 実はその後、いろいろ試行錯誤を繰り返しまして 結論から言いますと、ファイルを読んだり書き込んだり するときには絶対パスを指定しなくてはならなかったの ですが、私は相対パスを指定していたのでうまくいかな かったということが判明いたしました。 hyde-la様、Tma様にはいろいろとアドバイスをいただき 本当に感謝しております。 ありがとうございました。