diff -r cc8420fa5fce sys/src/cmd/file.c --- a/sys/src/cmd/file.c Fri Apr 09 16:48:07 2021 +0200 +++ b/sys/src/cmd/file.c Tue Apr 20 01:47:43 2021 +0300 @@ -169,6 +169,7 @@ int isface(void); int isexec(void); int isudiff(void); +int isexecscript(void); int p9bitnum(char*, int*); int p9subfont(uchar*); void print_utf(void); @@ -182,6 +183,7 @@ istring, /* recognizable by first string */ iself, /* ELF (foreign) executable */ isexec, /* native executables */ + isexecscript, /* executable scripts */ iff, /* interchange file format (strings) */ longoff, /* recognizable by 4 bytes at some offset */ isoffstr, /* recognizable by string at some offset */ @@ -198,7 +200,7 @@ isp9bit, /* plan 9 image (as from /dev/window) */ isrtf, /* rich text format */ ismsdos, /* msdos exe (virus file attachement) */ - isicocur, /* windows icon or cursor file */ + isicocur, /* windows icon or cursor file */ isface, /* ascii face file */ istga, ismp4, @@ -722,6 +724,40 @@ return 0; } +/* executable scripts */ +int +isexecscript(void) +{ + char a[64], *p; + + if (memcmp("#!", buf, 2) != 0) + return 0; + memmove(a, buf+2, sizeof a); + if ((p = strchr(a, '\n')) != nil) + *p = 0; + if ((p = strpbrk(a, " \t")) != nil) + *p = 0; + if ((p = strrchr(a, '/')) != nil) + p++; + else + p = a; + + if (strcmp("rc", p) == 0) + print("%s\n", mime ? PLAIN : "rc script"); + else if (strcmp("sh", p) == 0) + print("%s\n", mime ? "application/x-sh" : "sh script"); + else if (strcmp("bash", p) == 0) + print("%s\n", mime ? "application/x-sh" : "bash script"); + else if (strcmp("awk", p) == 0) + print("%s\n", mime ? PLAIN : "awk script"); + else if (strcmp("sed", p) == 0) + print("%s\n", mime ? PLAIN : "sed script"); + else if (strcmp("perl", p) == 0) + print("%s\n", mime ? PLAIN : "perl script"); + else + print("%s\n", mime ? PLAIN : "executable script"); + return 1; +} /* from tar.c */ enum { NAMSIZ = 100, TBLOCK = 512 }; @@ -805,8 +841,6 @@ "!\n__.SYMDEF", "archive random library", 16, OCTET, "!\n", "archive", 8, OCTET, "070707", "cpio archive - ascii header", 6, OCTET, - "#!/bin/rc", "rc executable file", 9, PLAIN, - "#!/bin/sh", "sh executable file", 9, PLAIN, "%!", "postscript", 2, "application/postscript", "\004%!", "postscript", 3, "application/postscript", "x T post", "troff output for post", 8, "application/troff", @@ -820,10 +854,10 @@ "%PDF", "PDF", 4, "application/pdf", "", "HTML file", 6, "text/html", "", "HTML file", 6, "text/html", - "