xref: /freebsd/usr.bin/script/script.1 (revision b985c9ca)
1.\" Copyright (c) 1980, 1990, 1993
2.\"	The Regents of the University of California.  All rights reserved.
3.\"
4.\" Redistribution and use in source and binary forms, with or without
5.\" modification, are permitted provided that the following conditions
6.\" are met:
7.\" 1. Redistributions of source code must retain the above copyright
8.\"    notice, this list of conditions and the following disclaimer.
9.\" 2. Redistributions in binary form must reproduce the above copyright
10.\"    notice, this list of conditions and the following disclaimer in the
11.\"    documentation and/or other materials provided with the distribution.
12.\" 3. Neither the name of the University nor the names of its contributors
13.\"    may be used to endorse or promote products derived from this software
14.\"    without specific prior written permission.
15.\"
16.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
17.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
20.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26.\" SUCH DAMAGE.
27.\"
28.Dd October 26, 2022
29.Dt SCRIPT 1
30.Os
31.Sh NAME
32.Nm script
33.Nd make typescript of terminal session
34.Sh SYNOPSIS
35.Nm
36.Op Fl aeFfkqrw
37.Op Fl t Ar time
38.Op Ar file Op Ar command ...
39.Nm
40.Fl p
41.Op Fl deq
42.Op Fl T Ar fmt
43.Op Ar file
44.Sh DESCRIPTION
45The
46.Nm
47utility makes a typescript of everything printed on your terminal.
48It is useful for students who need a hardcopy record of an interactive
49session as proof of an assignment, as the typescript file
50can be printed out later with
51.Xr lpr 1 .
52.Pp
53If the argument
54.Ar file
55is given,
56.Nm
57saves all dialogue in
58.Ar file .
59If no file name is given, the typescript is saved in the file
60.Pa typescript .
61.Pp
62If the argument
63.Ar command
64is given,
65.Nm
66will run the specified command with an optional argument vector
67instead of an interactive shell.
68.Pp
69The following options are available:
70.Bl -tag -width "-F pipe"
71.It Fl a
72Append the output to
73.Ar file
74or
75.Pa typescript ,
76retaining the prior contents.
77.It Fl d
78When playing back a session with the
79.Fl p
80flag, do not sleep between records when playing back a timestamped session.
81.It Fl e
82Accepted for compatibility with
83.Em util-linux
84.Nm .
85The child command exit status is always the exit status of
86.Nm .
87.It Fl F
88Immediately flush output after each write.
89This will allow a user to create a named pipe using
90.Xr mkfifo 1
91and another user may watch the live session using a utility like
92.Xr cat 1 .
93.It Fl f
94Create
95.Ar file.filemon
96or
97.Pa typescript.filemon
98using
99.Xr filemon 4 .
100.It Fl k
101Log keys sent to the program as well as output.
102.It Fl p
103Play back a session recorded with the
104.Fl r
105flag in real time.
106.It Fl q
107Run in quiet mode, omit the start, stop and command status messages.
108.It Fl r
109Record a session with input, output, and timestamping.
110.It Fl t Ar time
111Specify the interval at which the script output file will be flushed
112to disk, in seconds.
113A value of 0
114causes
115.Nm
116to flush after every character I/O event.
117The default interval is
11830 seconds.
119.It Fl T Ar fmt
120Implies
121.Fl p ,
122but just reports the time-stamp of each output.
123This is very useful for assessing the timing of events.
124.Pp
125If
126.Ar fmt
127does not contain any
128.Ql %
129characters, it indicates the default format:
130.Ql %n@ %s [%Y-%m-%d %T]%n ,
131which is useful for both tools and humans to read, should be used.
132Note that time-stamps will only be output when different from the
133previous one.
134.It Fl w
135Forward terminal size changes on
136.Dv SIGWINCH .
137.El
138.Pp
139The script ends when the forked shell (or command) exits (a
140.Em control-D
141to exit
142the Bourne shell
143.Pf ( Xr sh 1 ) ,
144and
145.Em exit ,
146.Em logout
147or
148.Em control-D
149(if
150.Em ignoreeof
151is not set) for the
152C-shell,
153.Xr csh 1 ) .
154.Pp
155Certain interactive commands, such as
156.Xr vi 1 ,
157create garbage in the typescript file.
158The
159.Nm
160utility works best with commands that do not manipulate the screen.
161The results are meant to emulate a hardcopy terminal, not an addressable one.
162.Sh ENVIRONMENT
163The following environment variables are utilized by
164.Nm :
165.Bl -tag -width SCRIPT
166.It Ev SCRIPT
167The
168.Ev SCRIPT
169environment variable is added to the sub-shell.
170If
171.Ev SCRIPT
172already existed in the users environment,
173its value is overwritten within the sub-shell.
174The value of
175.Ev SCRIPT
176is the name of the
177.Ar typescript
178file.
179.It Ev SHELL
180If the variable
181.Ev SHELL
182exists, the shell forked by
183.Nm
184will be that shell.
185If
186.Ev SHELL
187is not set, the Bourne shell
188is assumed.
189.Pq Most shells set this variable automatically .
190.El
191.Sh EXAMPLES
192Record a simple
193.Xr csh 1
194session with no additional details like input, output, and timestamping:
195.Bd -literal -offset indent
196$ SHELL=/bin/csh script
197Script started, output file is typescript
198% date
199Tue Jan  5 15:08:10 UTC 2021
200% exit
201exit
202
203Script done, output file is typescript
204.Ed
205.Pp
206Now, replay the session recorded in the previous example:
207.Bd -literal -offset indent
208$ cat ./typescript
209Script started on Tue Jan  5 15:08:08 2021
210% date
211Tue Jan  5 15:08:10 UTC 2021
212% exit
213exit
214
215Script done on Tue Jan  5 15:08:13 2021
216.Ed
217.Pp
218Record a
219.Xr csh 1
220session, but this time with additional details like timestamping:
221.Bd -literal -offset indent
222$ SHELL=/bin/csh script -r
223Script started, output file is typescript
224% date
225Tue Jan  5 15:17:11 UTC 2021
226% exit
227exit
228
229Script done, output file is typescript
230.Ed
231.Pp
232In order to replay a sessions recorded with the
233.Fl r
234flag, it is necessary to specify
235.Fl p
236.Po
237.Xr cat 1
238will not work because of all the aditional information stored in the session file
239.Pc .
240Also, let us use
241.Fl d
242to print the whole session at once:
243.Bd -literal -offset indent
244$ script -dp ./typescript
245Script started on Tue Jan  5 15:17:09 2021
246% date
247Tue Jan  5 15:17:11 UTC 2021
248% exit
249exit
250
251Script done on Tue Jan  5 15:17:14 2021
252.Ed
253.Sh SEE ALSO
254.Xr csh 1
255.Po
256for the
257.Em history
258mechanism
259.Pc ,
260.Xr filemon 4
261.Sh HISTORY
262The
263.Nm
264command appeared in
265.Bx 3.0 .
266.Pp
267The
268.Fl d ,
269.Fl p
270and
271.Fl r
272options first appeared in
273.Nx 2.0
274and were ported to
275.Fx 9.2 .
276.Sh BUGS
277The
278.Nm
279utility places
280.Sy everything
281in the log file, including linefeeds and backspaces.
282This is not what the naive user expects.
283.Pp
284It is not possible to specify a command without also naming the script file
285because of argument parsing compatibility issues.
286.Pp
287When running in
288.Fl k
289mode, echo cancelling is far from ideal.
290The slave terminal mode is checked
291for ECHO mode to check when to avoid manual echo logging.
292This does not
293work when the terminal is in a raw mode where
294the program being run is doing manual echo.
295.Pp
296If
297.Nm
298reads zero bytes from the terminal, it switches to a mode when it
299only attempts to read
300once a second until there is data to read.
301This prevents
302.Nm
303from spinning on zero-byte reads, but might cause a 1-second delay in
304processing of user input.
305