名前

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

書式

script [options] [file]

説明

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

出力を filetypescript に追加する。ファイルの既存の内容はそのまま保持される。

-c, --command command

対話シェルではなく、command を直接実行する。 これを用いると、 プログラムからの出力をスクリプトが取り込みやすくなるときがある。 それは、 標準出力が端末 (tty) ではないときに、 異なる動作を行うようなプログラムの場合である。

-E, --echo when

このオプションは、 セッションの疑似端末におけるスレーブ側の ECHO フラグを制御する。 サポートされるモードは always, never, auto である。

デフォルトは auto である — その場合 ECHO は、 疑似端末のスレーブに対して有効になる。 つまり、 その時点での標準入力が端末である場合、 ECHO は無効になり、 echo が繰り返されることはない。 また標準入力が端末ではない場合 (たとえば echo date | script を行った場合)、 疑似端末のスレーブに対して ECHO は有効のままであり、 画面上には標準入力データが表示される。 これと同時に、 その内容はセッションログにも記録される。

'never' モードは、 セッションの出力ログ内容に影響する点に注意すること。 ユーザー入力は、 繰り返して出力されないからである。

-e, --return

子プロセスの終了ステータスを返す。 子プロセスがシグナルによって終了させられたときの終了ステータスには、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 も参照のこと。

-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 を指定した場合は、 タイミングデータの出力先がそのファイルになる。 このオプションは非推奨であり、 --log-timing の使用をお勧めする。 なお --log-timing では、 引数 file の指定は必須である。

-h, --help

ヘルプを表示して終了する。

-V, --version

バージョンを表示して終了する。

シグナル

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)

バグ報告

バグ報告は、 以下にある issue トラッカーを利用すること。 <https://github.com/util-linux/util-linux/issues>.

入手方法

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