While doing a testing session this afternoon,
Chris mentioned a little command that I
hadn’t used before:
script allows you to record everything that
happens inside a terminal session and to play it back afterwards.
Turns out, it is shipped by default with macOS and most Linux
distributions (e.g. as part of the
bsdutils package). If
all you want to do, is keep a look of commands and their respective
output, just run
script OUTPUT_FILE. Now, all the commands you enter
before closing the terminal session (end with
exit or Ctrl-d) will
$ script session.typescript Script started, output file is session.typescript $ echo "hello" hello $ exit Script done, output file is session.typescript
If you open
session.typescript inside an editor you will see not
only the commands and their output but also your applied shell prompt!
Basically as much as possible of what was visible in the original
Sadly, if you want to go beyond the pure logging of commands then the
script command on macOS has a different parameter set compared to
the one being available for instance on a Debian installation.
Recording a session (for replay)
In order to record a session on macOS that should also be replayable, you would use the following command:
$ script -r session.typescript
On Linux you will actually have to instruct script to generate two files: (1) that holds the commands and their respective output and (2) a timing-file that stores when what should be displayed during replay:
$ script --timing=session.timing session.typescript
Playing back a recording
Since the two commands produce different output files, the replay-functionality also expects different inputs.
On macOS you can reuse the
script command but with the
$ script -p session.typescript
On Linux replaying is handled by a different command that expects both, the timing file and the typescript:
$ scriptreplay --timing session.timing \ --typescript session.typescript
If you need to share a replay between platforms, it’s probably worth taking a look at asciinema:
# Record $ asciinema rec session.cast # Playback $ asciinema play session.cast
asciinema stores the recording in a simple JSON format. You can find its specification here.