If your UNIX
understands (44.4)
executable files that start with #!
,
you can use this nice trick to make executable files that display
themselves (or part of themselves).
I used this to make a program named help on a system that didn't
have any online help.
A program like
cat (25.2)
isn't what you want because it'll display the
#!
line as well as the message.
Watch what happens:
%cat help
#!/bin/cat For help with UNIX, call the ACS Consulting Hotline at 555-1212. man command shows the manual for a command ... %chmod +x help
%help
#!/bin/cat For help with UNIX, call the ACS Consulting Hotline at 555-1212. man command shows the manual for a command ...
The trick is to invoke an interpreter that shows all the lines except
the line starting with #!
.
For example, this file uses
sed (34.24)
and its d command
to ignore ("delete") the first line:
%cat help
#!/bin/sed 1d For help with UNIX, call the ACS Consulting Hotline at 555-1212. man command shows the manual for a command ... %help
For help with UNIX, call the ACS Consulting Hotline at 555-1212. man command shows the manual for a command ...
For longer files, try using
more +2
(25.3);
this file will show itself screenful-by-screenful, starting at line 2:
%cat help
#!/usr/ucb/more +2 For help with UNIX, call the ACS Consulting Hotline at 555-1212. man command shows the manual for a command ...
You have to give the absolute pathname to the interpreter because the
kernel doesn't use your
search path (8.7).
The kernel can pass just one argument to the interpreter. More than
one argument probably won't work. In the next example, I try to pass
two arguments to grep-but the kernel passes the whole string
-v #
as just one argument. That confuses grep, which
complains about every character from the space on:
%cat help
#!/bin/grep -v # For help with UNIX, call the ACS Consulting Hotline at 555-1212. man command shows the manual for a command ... %help
grep: illegal option -- grep: illegal option -- ^ grep: illegal option -- # Usage: grep -hblcnsvi pattern file . . .
(Remember, there's no shell interpreting the arguments here. The kernel does it.)
-