diff options
author | peter <peter@FreeBSD.org> | 1997-12-29 13:31:46 +0000 |
---|---|---|
committer | peter <peter@FreeBSD.org> | 1997-12-29 13:31:46 +0000 |
commit | c43811df0f3bbb4cf72506ab4631a3107f631ee3 (patch) | |
tree | fd5e1c700f95dabcf01adafb4b72d7d65233711a /usr.bin/script | |
parent | 6ce389dcd3ca5e48ae7fe956e958367d36db2097 (diff) | |
download | FreeBSD-src-c43811df0f3bbb4cf72506ab4631a3107f631ee3.zip FreeBSD-src-c43811df0f3bbb4cf72506ab4631a3107f631ee3.tar.gz |
script(1) has annoyed me with it's inflexable command argument parsing
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.
Diffstat (limited to 'usr.bin/script')
-rw-r--r-- | usr.bin/script/script.1 | 17 | ||||
-rw-r--r-- | usr.bin/script/script.c | 40 |
2 files changed, 43 insertions, 14 deletions
diff --git a/usr.bin/script/script.1 b/usr.bin/script/script.1 index 7c1032f0..6c0f7d6 100644 --- a/usr.bin/script/script.1 +++ b/usr.bin/script/script.1 @@ -30,6 +30,7 @@ .\" SUCH DAMAGE. .\" .\" @(#)script.1 8.1 (Berkeley) 6/6/93 +.\" $Id$ .\" .Dd June 6, 1993 .Dt SCRIPT 1 @@ -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. @@ -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 @@ -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 @@ -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. diff --git a/usr.bin/script/script.c b/usr.bin/script/script.c index 5952a9b..f02f868 100644 --- a/usr.bin/script/script.c +++ b/usr.bin/script/script.c @@ -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> @@ -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)); @@ -90,11 +91,14 @@ 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(); @@ -102,9 +106,11 @@ main(argc, argv) 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) @@ -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; @@ -136,7 +143,7 @@ main(argc, argv) if (child) dooutput(); else - doshell(); + doshell(argv); } (void)fclose(fscript); @@ -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); } @@ -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; @@ -207,7 +215,8 @@ scriptflush(signo) } void -doshell() +doshell(av) + char **av; { char *shell; @@ -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(); } @@ -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); } |