script コマンド


main
main 内で logging_start を呼び出して開始

logging_start の定義
logging_start は log_start を呼び出す

log_start の定義
log_start 内で ファイルを開く
log_start 内で開始時のテキストを書く

終了する際は log_close
log_close の定義
log_close 内で終了時のテキストを書く
log_close は logging_done から呼ばれる

logging_done の定義
logging_done は二か所から呼ばれる
callback_log_stream_activity の logging_done はエラーっぽい
main の goto done で logging_done に到達
goto done は logging_start の次に実行

log_write で実際の書き込みが行われていそう
log_write の定義
4番目の引数 obuf を log->fp に書き込む
log->format によって,書き込み方が異なる
スクリプトはストリーム(stdout/stdin)の活動によって駆動されます。ストリームには、任意の数のログファイルを関連付けることが可能です。ログファイルには基本的に2つのタイプがある。「タイミングファイル(シンプルまたはマルチストリーム)とデータファイル(生)です。
同じログファイルを両方のストリームで共有することができます。例えば、マルチストリームのタイミングファイルは、標準入力と標準出力に使用することが可能です。
www.DeepL.com/Translator(無料版)で翻訳しました。
ふつうは SCRIPT_FMT_RAW なのだと思う
log_write 内の fwrite_all で書き込む
log_write は log_stream_activity から呼ばれる

fwrite_all の定義 (別ファイル)
size_t nmemb が 0 になるまで 減らしながら fwrite で ptr を stream に書き込む

log_stream_activity の定義
第3引数 buf を書き込む
log_stream_activity は callback_log_stream_activity から呼ばれる

callback_log_stream_activity の定義
stdin → command と,
command → stdout , log の二か所で呼ばれている
callback_log_stream_activity は main の中で, struct ul_pty_callbacks 構造体の log_stream_activity 関数ポインタに格納している

cb の型は struct ul_pty_callbacks *
cb は ctl.pty の callbacks メンバ
ctl.pty は ul_pty 構造体のポインタ
ctl は main 内で定義された script_contrl 構造体
script_control 構造体の定義
pty は pseud terminal の略

ul_pty_callbacks 構造体の定義
log_stream_activity は master か 標準入力のアクティビティで実行
引数2: ファイルディスクリプタ
引数3: データのバッファ
引数4: データのサイズ

log_stream_activity は handle_io から呼ばれる
handle_io の定義
handle_io は ul_pty_proxy_master から呼ばれる
ul_pty_proxy_master の定義
ul_pty_proxy_master は script.c の main の中から呼ばれる
メインループらしい

script.cを削ってみる
BasedOnStyle: Google
前半
後半

termios
pty, tty
isatty
端末から入力,端末へ出力する場合は,Trueになる

getpid
kill
getenv
fork
Go言語では fork は使わない

signal

script コマンドの出力結果の制御文字を消して標準出力に出力する.
これだと,scriptコマンド実行時に一度表示されて消えた文字が残ったまま表示される.
file, _ := os.Open("typescript")
defer file.Close()
stdOut := colorable.NewNonColorable(os.Stdout)
io.Copy(stdOut, file)