SCRIPT(1)

名前
script - 端末セッションの忠実な記録を作成する

書式
script [options] [file]

バージョンについて
このマニュアルは、util-linux 2.36 所収の script コマンドのマニュアルである。script コマンドは util-linux 2.35 でかなり大幅な改訂が行われた。そのため、バージョン 2.34 以前の script では、このマニュアルで述べている機能やオプションに使えないものがあると思う。 バージョン 2.34 やそれ以前の script の動作やオプションについては、 付属の英語マニュアルをご覧いただきたい。

説明
script は、端末セッションで行われるすべてについて忠実な記録 (タイプスクリプト、typescript) を作成する。端末上のデータは、未加工のまま (in raw form) ログファイルに記録され、 タイミングに関する情報は、(作成する、しないが任意の) 構造化された別のログファイルに記録される。このタイミングのログファイルは、後で scriptreplay(1) を使用して、セッションを再生するためにも、 またセッションに関する補足情報を記録するためにも必要である。

バージョン 2.35 以降の script は、複数ストリームをサポートし、 入力と出力を別々のファイルに記録することも、 両者を一つのファイルに記録することも可能になっている。 またそうしたバージョンでは、補足情報を記録する新型のタイミングファイルも使用できる。 scriptreplay --summary というコマンドを使えば、そうした補足情報のすべてを見ることができる。

引き数の file やオプションの --log-out file を指定すると、script はセッションのやり取りを file という名前のファイルに記録する。ファイル名を指定しない場合は、セッションのやり取りを typescript というファイルに記録することになる。

--log-in や --log-io を使って入力のログを取ると、セキュリティ的に危険な情報まで記録されることになるかもしれない。 端末のエコーフラグ (echo flag) の設定がどうなっていようと、 ログファイルに端末セッションにおけるすべての入力が書き込まれるからである (たとえば、パスワードまでも)。

オプション
以下で使用する引き数 size の後ろには、KiB (=1024), MiB (=1024*1024) のような乗数を表す接尾辞を付けることができる。GiB, TiB, PiB, EiB, ZiB, YiB も同様に使える　("iB" を続けるのは任意であり、たとえば、"K" は "KiB" と同じ意味である)。また、KB (=1000), MB (=1000*1000) のような接尾辞を付けてもよい。GB, TB, PB, EB, ZB, YB も同様に使える。

-a, --append
    出力を file や typescript に追加する。ファイルの既存の内容はそのまま保持される。

-c, --command command
    対話シェルではなく、command を直接実行する。 そうすることで、標準出力が端末 (tty) ではない場合に動作が違ったものになるプログラムの出力が、取り込みやすくなる。

-E, --echo when
    このオプションは、セッション中で使われる疑似端末の ECHO フラグを制御する。サポートされるモードは、always, never, auto である。デフォルトは auto であり、その場合は、目下の標準入力が端末ならば、 二重のエコーを避けるために、ECHO は抑止され、標準入力が端末でないならば (たとえば、echo date | script のように、標準入力がパイプの場合)、 セッションログに入力の記録漏れが起きないように、ECHO は有効になる。

-e, --return
    子プロセスの終了ステータスを返す (訳注: 詳しく言うと、script 上で最後に実行したプロセスの終了ステータスを script の終了ステータスとして返すようにする)。 子プロセスがシグナルによって終了させられたときの終了ステータスには、bash の場合と同じ形式を使用する (すなわち、「128 + シグナル番号」である)。 子プロセスのその終了ステータスは、タイプスクリプトファイルにも常に記録される。

-f, --flush
    書き込みをするたびに出力をフラッシュする。 離れた場所で共同作業をしているとき、これは役に立つ。 片方が `mkfifo foo; script -f foo' をすれば、もう一方は `cat foo' を使って、相手が何をやっているかリアルタイムで監視できるわけである。 頻繁にフラッシュすると、パフォーマンスに影響が出ることに注意していただきたい。 SIGUSR1 シグナルを使って、オンデマンドでログをフラッシュすることもできる。

--force
    デフォルトの出力ファイル typescript がハードリンクやシンボリックリンクであってもよいことにする。すなわち、script コマンドがシンボリックをたどるようになる。

-B, --log-io file
    入力と出力のログを同じファイル file に記録する。注意してほしいが、このオプションに意味があるのは、--log-timing オプションも一緒に指定した場合だけである。そうしないと、ログファイル file 中の出力ストリームと入力ストリームを分離できないことになる。

-I, --log-in file
    入力を file に記録する。--log-in だけを指定すると、出力のログは作成されないことになる。

    このログ機能を使うときは、気を付けていただきたい。 端末でエコーフラグを「抑止」にしているときの入力も含めて、すべての入力を記録するからである (たとえば、パスワードの入力も記録する)。

-O, --log-out file
    出力を file に記録する。オプション --log-out や --log-in を指定しない場合、出力が記録されるのは、デフォルトでは typescript という名前のファイルである。--log-in だけを指定すると、出力のログは作成されないことになる。

-T, --log-timing file
    タイミング情報を file に記録する。現在では、タイミングファイルに 2 種類のフォーマットが使用できるようになっている。 classic (従来型) フォーマットは、(入力なり、出力なり) 片方のストリームのロギングのみが有効になっている場合に使用される。 マルチストリーム型のフォーマットが使用されるのは、--log-io のときか、--log-in と --log-out が一緒に使われているときである。 --logging-format も参照していただきたい。

    [訳注]
        次の --logging-format についても言えることだが、「デフォルトでは、--log-in さえ指定されていれば、--log-out が指定されていないでも、advanced (新型) フォーマットが使用される」、というのが正確な説明のようだ。--log-in だけ指定するというのは、scriptlive での再実行を考えているのでないかぎり、意味のないことだが。

-m, --logging-format format
    タイミングファイルに強制的に advanced (新型) または classic (従来型) フォーマットを使用させる。 デフォルトは、出力のみをログに記録する場合は、従来型であり、 入力と出力、両方のロギングが要求されている場合は、新型である。

    classic フォーマット

    ログは、スペースで区切られた二つのフィールドからなる。 最初のフィールドは、前回の出力から経過した時間を示し、2 番目のフィールドは、今回、何文字 (characters) 出力したかを示している。

    advanced (multi-stream) フォーマット

    最初のフィールドは、記載事項のタイプ識別子である ('I'nput, 'O'utput, 'H'eader, 'S'ignal)。2 番目のフィールドは、前回の記録から経過した時間。 そして、記載事項の残りの部分は、タイプ特有のデータである。

-o, --output-limit size
    タイプスクリプトファイルやタイミングファイルの上限を size までとし、そのサイズを越えたら、子プロセスをストップする。 ファイルサイズの計算には、script コマンドが子プロセスの出力の前後に付ける開始や終了のメッセージは入らない。 バッファリングのせいで、生成される出力ファイルが、指定した値より大きくなることがある。

-q, --quiet
    寡黙モード (開始や終了のメッセージを標準出力に書き出さない)。

-t[file], --timing[=file]
    タイミングデータを標準エラーに出力する。file を指定した場合は、 タイミングデータの出力先がそのファイルになる (訳注: 短いオプション -t とタイミングファイル名は、間に空白を入れず、続けて書かなければならない。 そうしないと、タイミングデータが標準エラーに出力されてしまう)。 このオプションは非推奨であり、--log-timing の使用をお勧めする。 なお、--log-timing では、引き数 file の指定は任意ではない (訳注: つまり、必須である)。

-V, --version
    バージョン情報を表示して終了する。

-h, --help
    ヘルプを表示して終了する。

シグナル
SIGUSR1 を受け取ると、script は直ちにバッファの内容を出力ファイルにフラッシュする。

環境変数
次の環境変数を script は利用する。

SHELL
    環境変数 SHELL が存在すれば、script からフォークするシェルは、そのシェルになる。SHELL が設定されていない場合は、Bourne シェルだと見なされる (ほとんどのシェルが、この変数を自動的に設定する)。

注意
script コマンドが記録を終えるのは、フォークしたシェルが終了するときである (Bourne シェル (sh(1p)) では、control-D で終了する。C シェル (csh(1)) では、exit, logout、あるいは (ignoreeof が設定されていない場合は) control-D で終了する)。

vi のような対話的なコマンドには、タイプスクリプトファイルにゴミを作るものがある。 script は、複雑な画面処理をしないコマンドを使ったとき、一番うまく行く。 作成される記録は、ハードコピー端末 (訳注: スクリーンではなく、紙に出力する端末。テレタイプがその一例) をエミュレートするようになっているのである。

script を非対話的シェルで動かすのは、お勧めできない。script の内側のシェルは、常に対話的であり、そのため予期せぬ結果をもたらすかもしれないからだ。 もし、script をシェルの初期化ファイルで使用するのなら、 無限ループに陥らないように気を付けなければならない。たとえば、以下のような .profile ファイルを使うことができるが、これなら読み込むのは、ログインシェルだけになる。

    if test -t 0 ; then
        script
        exit
    fi

また、パイプを使ったコマンドで script を使うのも避けたほうがよい。 script が、ユーザの思っている以上に入力を読み込むかもしれないからである。

歴史
script コマンドは 3.0BSD で登場した。

バグ
script は、ラインフィードやバックスペースも含めて、すべてをログファイルに書き込む。 これは、初心ユーザの予想する動作ではないだろう。

script は、そもそも対話的な端末セッションを対象に設計されている。 そのため、標準入力が端末でないときは (たとえば、echo foo | script)、 セッションがハングするかもしれない。何故なら、script セッション内の対話的シェルが EOF を受け取りそこなうと、script としては、いつセッションを閉じればよいのか、手がかりをつかめないからである。 詳しくは、「注意」セクションをご覧になっていただきたい。

関連項目
csh(1) (history のメカニズムについて), scriptreplay(1), scriptlive(1)

入手方法
この script コマンドは、util-linux パッケージの一部であり、Linux Kernel Archive <https://www.kernel.org/pub/linux/utils/util-linux/> から入手できる。