The --run option makes it possible to use mailfromd
scripts as standalone programs. The traditional way to do so was to
set the executable bit on the script file and to begin the script with
the interpreter selector, i.e. the characters ‘#!’ followed by
the name of the mailfromd
executable, e.g.:
#! /usr/sbin/mailfromd --run
This would cause the shell to invoke mailfromd
with the
command line constructed from the --run option, the name
of the invoked script file itself, and any actual arguments from
the invocation. Once invoked, mailfromd
would treat the
initial ‘#!’ line as a usual single-line comment
(see Comments).
However, the interpretation of the ‘#!’ by shells has various
deficiencies, which depend on the actual shell being used. For
example, some shells pass any characters following the whitespace
after the interpreter name as a single argument, some others silently
truncate the command line after some number of characters, etc. This
often make it impossible to pass additional arguments to
mailfromd
. For example, a script which begins with the
following line would most probably fail to be executed properly:
#! /usr/sbin/mailfromd --echo --run
To compensate for these deficiencies and to allow for more complex
invocation sequences, mailfromd
handles initial ‘#’
in a special way. If the first line of a source file begins with
‘#!/’ or ‘#! /’ (with a single space between ‘!’ and
‘/’), it is treated as a start of a multi-line comment, which is
closed by the two characters ‘!#’ on a line by themselves.
Thus, the correct way to begin a mailfromd
script is:
#! /usr/sbin/mailfromd --run !#
Using this feature, you can start the mailfromd
with
arbitrary shell code, provided it ends with an exec
statement
invoking the interpreter itself. For example:
#!/bin/sh exec /usr/sbin/mailfromd --echo --run $0 $@ !# func main(...) returns number do /* actual mfl code goes here */ done
Note the use of ‘$0’ and ‘$@’ to pass the actual script file
name and command line arguments to mailfromd
.