<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/features.commandline.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ja',
  ),
  'this' => 
  array (
    0 => 'features.commandline.interactive.php',
    1 => '対話シェル',
    2 => '対話シェル',
  ),
  'up' => 
  array (
    0 => 'features.commandline.php',
    1 => 'コマンドラインの使用法',
  ),
  'prev' => 
  array (
    0 => 'features.commandline.io-streams.php',
    1 => 'I/O ストリーム',
  ),
  'next' => 
  array (
    0 => 'features.commandline.webserver.php',
    1 => 'ビルトインウェブサーバー',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ja',
    'path' => 'features/commandline.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="features.commandline.interactive" class="section">
  <h2 class="title">対話シェル</h2>

  <p class="para">
   <strong class="option configure">--with-readline</strong> オプションつきで
   PHP をコンパイルした場合に <abbr title="Command Line Interpreter/Interface">CLI</abbr> <abbr title="Server Application Programming Interface">SAPI</abbr> で対話シェルが使えるようになりました。
   対話シェルは、<strong class="option unknown">-a</strong> オプションで使うことができます。
   PHP 7.1.0 以降では、<a href="book.readline.php" class="link">readline 拡張モジュール</a> が有効であれば
   対話シェルは Windows 上でも使用可能です。
  </p>

  <p class="para">
   対話シェルを使うと、PHP のコードを打ち込んで直接実行できるようになります。
  </p>

  <div class="example" id="example-1">
   <p><strong>例1 対話シェル上でのコードの実行</strong></p> 
   <div class="example-contents">
<div class="shellcode"><pre class="shellcode">$ php -a
Interactive shell

php &gt; echo 5+8;
13
php &gt; function addTwo($n)
php &gt; {
php { return $n + 2;
php { }
php &gt; var_dump(addtwo(2));
int(4)
php &gt;</pre>
</div>
   </div>

  </div>

  <p class="para">
   対話シェル上では、タブ補完機能を使って
   関数や定数、クラス名、変数名、static メソッドの呼び出し、
   そしてクラス定数を補完することができます。
  </p>

  <div class="example" id="example-2">
   <p><strong>例2 タブ補完</strong></p>
   <div class="example-contents"><p>
    補完候補が複数あるときにタブキーを二度押すと、
    補完候補の一覧が表示されます。
   </p></div>
   <div class="example-contents">
<div class="shellcode"><pre class="shellcode">php &gt; strp[TAB][TAB]
strpbrk   strpos    strptime  
php &gt; strp</pre>
</div>
   </div>

   <div class="example-contents"><p>
    候補がひとつしかないときは、タブキーを一度押せば残りを補完してくれます。
   </p></div>
   <div class="example-contents">
<div class="shellcode"><pre class="shellcode">php &gt; strpt[TAB]ime(</pre>
</div>
   </div>

   <div class="example-contents"><p>
    対話シェルのセッション上で定義したものについても補完することができます。
   </p></div>
   <div class="example-contents">
<div class="shellcode"><pre class="shellcode">php &gt; $fooThisIsAReallyLongVariableName = 42;
php &gt; $foo[TAB]ThisIsAReallyLongVariableName</pre>
</div>
   </div>

  </div>

  <p class="simpara">
   対話シェル上では操作履歴が保存され、上矢印キーと下矢印キーで履歴にアクセスすることができます。
   履歴の保存先は <var class="filename">~/.php_history</var> ファイルです。
   PHP 8.4.0 以降では、環境変数 <var class="envar">PHP_HISTFILE</var> を使って
   履歴ファイルのパスを設定できます。
  </p>

  <p class="para">
   <abbr title="Command Line Interpreter/Interface">CLI</abbr> <abbr title="Server Application Programming Interface">SAPI</abbr> では、二つの
   <var class="filename">php.ini</var> 設定が使えます。<code class="parameter">cli.pager</code> と
   <code class="parameter">cli.prompt</code> です。<code class="parameter">cli.pager</code>
   は、外部のプログラム (<var class="filename">less</var> など)
   を出力のページャとして指定することができます。
   出力が画面に直接送られるかわりに、このページャに送られるようになります。
   <code class="parameter">cli.prompt</code> を指定すると、
   <code class="literal">php &gt;</code> プロンプトを変更することができます。
  </p>

  <p class="para">
   また、対話シェルの中では、
   <var class="filename">php.ini</var> 項目を設定する際に短縮記法が使えます。
  </p>

  <div class="example" id="example-3">
   <p><strong>例3 対話シェル内での <var class="filename">php.ini</var> の設定</strong></p>
   <div class="example-contents"><p>
    <code class="parameter">cli.prompt</code> を設定します。
   </p></div>
   <div class="example-contents">
<div class="shellcode"><pre class="shellcode">php &gt; #cli.prompt=hello world :&gt; 
hello world :&gt;</pre>
</div>
   </div>

   <div class="example-contents"><p>
    バッククォートを使うと、PHP のコードの実行結果をプロンプトとして用いることができます。
   </p></div>
   <div class="example-contents">
<div class="shellcode"><pre class="shellcode">php &gt; #cli.prompt=`echo date(&#039;H:i:s&#039;);` php &gt; 
15:49:35 php &gt; echo &#039;hi&#039;;
hi
15:49:43 php &gt; sleep(2);
15:49:45 php &gt;</pre>
</div>
   </div>

   <div class="example-contents"><p>
    ページャを <var class="filename">less</var> に設定します。
   </p></div>
   <div class="example-contents">
<div class="shellcode"><pre class="shellcode">php &gt; #cli.pager=less
php &gt; phpinfo();
(出力が less に送られます)
php &gt;</pre>
</div>
   </div>

  </div>

  <p class="para">
   <code class="parameter">cli.prompt</code> の設定は、次のようなエスケープシーケンスに対応しています。
   <table class="doctable table">
    <caption><strong><code class="parameter">cli.prompt</code> のエスケープシーケンス</strong></caption>
    
     <thead>
      <tr>
       <th>シーケンス</th>
       <th>説明</th>
      </tr>

     </thead>

     <tbody class="tbody">
      <tr>
       <td><code class="literal">\e</code></td>
       <td>
        プロンプトに色をつけます。たとえば
        <code class="literal">\e[032m\v \e[031m\b \e[34m\&gt; \e[0m</code>
        のように使います。
       </td>
      </tr>

      <tr>
       <td><code class="literal">\v</code></td>
       <td>PHP のバージョン。</td>
      </tr>

      <tr>
       <td><code class="literal">\b</code></td>
       <td>
        PHP が今どのブロックにいるのかを示します。たとえば、
        複数行コメントの中にいる場合は <code class="literal">/*</code> となります。
        外側のスコープは <code class="literal">php</code> で表します。
       </td>
      </tr>

      <tr>
       <td><code class="literal">\&gt;</code></td>
       <td>
        プロンプト文字を示します。デフォルトでは
        <code class="literal">&gt;</code> ですが、ブロックや文字列の途中にあるときは変わります。
        <code class="literal">&#039; &quot; {
        ( &gt;</code> のような文字になることがあります。
       </td>
      </tr>

     </tbody>
    
   </table>

  </p>

  <blockquote class="note"><p><strong class="note">注意</strong>: 
   <p class="para">
    <a href="ini.core.php#ini.auto-prepend-file" class="link">auto_prepend_file</a> および <a href="ini.core.php#ini.auto-append-file" class="link">auto_append_file</a> で
    インクルードされたファイルはこのモードでもパースされますが、
    いくつかの制限があります。例えば、関数はそれがコールされる前に
    定義されていなければなりません。
   </p>
  </p></blockquote>

  <div class="section" id="features.commandline.interactive.mode">
   <h2 class="title">インタラクティブモード</h2>
   <p class="para">
    PHP 8.1.0 より前のバージョンでは、readline 拡張モジュールが利用できない場合に、
    <abbr title="Command Line Interpreter/Interface">CLI</abbr> <abbr title="Server Application Programming Interface">SAPI</abbr> を <strong class="option unknown">-a</strong>
    オプション付きで呼び出すとインタラクティブモードになっていました。
    このモードでは、
    完全な PHP スクリプトを標準入力(STDIN)から与えなければいけません。
    スクリプトを入力後、
    <kbd class="keycombo">
     <kbd class="keycap">CTRL</kbd>
     +<kbd class="keycap">D</kbd>
    </kbd>
    (POSIXの場合) や
    <kbd class="keycombo">
     <kbd class="keycap">CTRL</kbd>
     +<kbd class="keycap">Z</kbd>
    </kbd>
    の後に +<kbd class="keycap">ENTER</kbd> (Windows)
    を続けると、その PHP スクリプトが評価されていました。
    <abbr title="Command Line Interpreter/Interface">CLI</abbr> <abbr title="Server Application Programming Interface">SAPI</abbr> を <strong class="option unknown">-a</strong>
    なしで呼び出しても基本的に同じ動きをします。
   </p>
   <p class="para">
    PHP 8.1.0 以降では、
    readline 拡張モジュールが利用できない場合、
    <abbr title="Command Line Interpreter/Interface">CLI</abbr> <abbr title="Server Application Programming Interface">SAPI</abbr> に <strong class="option unknown">-a</strong>
    オプションを付けた呼び出しは失敗します。
   </p>
  </div>
 </div><?php manual_footer($setup); ?>