Skip to content

Commit

Permalink
script(1) has annoyed me with it's inflexable command argument parsing
Browse files Browse the repository at this point in the history
since I first saw it.  I finally needed to pass arguments through to
the spawned command badly enough (and urgently) that I threw this together.
  • Loading branch information
DarkHelmet433 committed Dec 29, 1997
1 parent 26b044d commit 51afb8d
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 14 deletions.
17 changes: 16 additions & 1 deletion usr.bin/script/script.1
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
.\" SUCH DAMAGE.
.\"
.\" @(#)script.1 8.1 (Berkeley) 6/6/93
.\" $Id$
.\"
.Dd June 6, 1993
.Dt SCRIPT 1
Expand All @@ -40,7 +41,9 @@
.Sh SYNOPSIS
.Nm
.Op Fl a
.Op Fl q
.Op Ar file
.Op Ar command ...
.Sh DESCRIPTION
.Nm Script
makes a typescript of everything printed on your terminal.
Expand All @@ -58,6 +61,13 @@ saves all dialogue in
If no file name is given, the typescript is saved in the file
.Pa typescript .
.Pp
If the argument
.Ar command ...
is given,
.Nm
will run the specified command with an optional argument vector
instead of an interactive shell.
.Pp
Option:
.Bl -tag -width Ds
.It Fl a
Expand All @@ -66,9 +76,11 @@ Append the output to
or
.Pa typescript ,
retaining the prior contents.
.It Fl q
Run in quiet mode, omit the start and stop status messages.
.El
.Pp
The script ends when the forked shell exits (a
The script ends when the forked shell (or command) exits (a
.Em control-D
to exit
the Bourne shell
Expand Down Expand Up @@ -121,3 +133,6 @@ places
.Sy everything
in the log file, including linefeeds and backspaces.
This is not what the naive user expects.
.Pp
It is not possible to specify a command without also naming the script file
because of argument parsing compatability issues.
40 changes: 27 additions & 13 deletions usr.bin/script/script.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ static const char copyright[] =
static char sccsid[] = "@(#)script.c 8.1 (Berkeley) 6/6/93";
#endif
static const char rcsid[] =
"$Id$";
"$Id: script.c,v 1.5 1997/08/08 12:24:49 charnier Exp $";
#endif /* not lint */

#include <sys/types.h>
Expand All @@ -67,12 +67,13 @@ int master, slave;
int child, subchild;
int outcc;
char *fname;
int qflg;

struct termios tt;

void done __P((void)) __dead2;
void dooutput __P((void));
void doshell __P((void));
void doshell __P((char **));
void fail __P((void));
void finish __P((int));
void scriptflush __P((int));
Expand All @@ -90,21 +91,26 @@ main(argc, argv)
char ibuf[BUFSIZ];

aflg = 0;
while ((ch = getopt(argc, argv, "a")) != -1)
while ((ch = getopt(argc, argv, "aq")) != -1)
switch(ch) {
case 'a':
aflg = 1;
break;
case 'q':
aflg = 1;
break;
case '?':
default:
usage();
}
argc -= optind;
argv += optind;

if (argc > 0)
if (argc > 0) {
fname = argv[0];
else
argv++;
argc--;
} else
fname = "typescript";

if ((fscript = fopen(fname, aflg ? "a" : "w")) == NULL)
Expand All @@ -115,7 +121,8 @@ main(argc, argv)
if (openpty(&master, &slave, NULL, &tt, &win) == -1)
err(1, "openpty");

(void)printf("Script started, output file is %s\n", fname);
if (!qflg)
(void)printf("Script started, output file is %s\n", fname);
rtt = tt;
cfmakeraw(&rtt);
rtt.c_lflag &= ~ECHO;
Expand All @@ -136,7 +143,7 @@ main(argc, argv)
if (child)
dooutput();
else
doshell();
doshell(argv);
}

(void)fclose(fscript);
Expand All @@ -148,7 +155,7 @@ main(argc, argv)
static void
usage()
{
(void)fprintf(stderr, "usage: script [-a] [file]\n");
(void)fprintf(stderr, "usage: script [-a] [-q] [file] [command]\n");
exit(1);
}

Expand Down Expand Up @@ -178,7 +185,8 @@ dooutput()

(void)close(STDIN_FILENO);
tvec = time(NULL);
(void)fprintf(fscript, "Script started on %s", ctime(&tvec));
if (!qflg)
(void)fprintf(fscript, "Script started on %s", ctime(&tvec));

(void)signal(SIGALRM, scriptflush);
value.it_interval.tv_sec = 60 / 2;
Expand Down Expand Up @@ -207,7 +215,8 @@ scriptflush(signo)
}

void
doshell()
doshell(av)
char **av;
{
char *shell;

Expand All @@ -218,7 +227,10 @@ doshell()
(void)close(master);
(void)fclose(fscript);
login_tty(slave);
execl(shell, "sh", "-i", NULL);
if (av[0])
execv(av[0], av);
else
execl(shell, "sh", "-i", NULL);
warn(shell);
fail();
}
Expand All @@ -238,12 +250,14 @@ done()

if (subchild) {
tvec = time(NULL);
(void)fprintf(fscript,"\nScript done on %s", ctime(&tvec));
if (!qflg)
(void)fprintf(fscript,"\nScript done on %s", ctime(&tvec));
(void)fclose(fscript);
(void)close(master);
} else {
(void)tcsetattr(STDIN_FILENO, TCSAFLUSH, &tt);
(void)printf("Script done, output file is %s\n", fname);
if (!qflg)
(void)printf("Script done, output file is %s\n", fname);
}
exit(0);
}

0 comments on commit 51afb8d

Please sign in to comment.