9. Commands
The macro run is used to run a program:
The macro exec is like run, but it does
an execve without a prior fork.
An implicit run is added before an undeclared
identifier that matches an executable in PATH:
Note that the run is inserted at macro-expansion
time, not at run-time. Hence the program (here ls)
must be in the PATH both at compile-time and
run-time. (Otherwise, the compiler would not know
whether to compile -l as subtraction or to quote it.)
9.1 Standard input and output
If we think of running a program as a kind of function call,
it is natural to think of a pipeline as function composition:
The output of one function is used directly as an input
of another. It is reasonable to view standard input and output
abstractly as strings.
A program has two sets of inputs: The command line arguments
(passed in argv), and standard input.
Q allows infix functions, with a varying number of right
parameters. We will interpret the left argument (if any)
as standard input to the program, and the right arguments
will be passed as argv. The left argument will be
evaluated, while the right arguments will be quoted.
We can pass a string to a program:
| | Q1> "Hello World!\n" run /usr/bin/tr a-zA-Z A-Za-z
hELLO wORLD!
|
The stdin argument need not be a string, but can be
any printable object:
| | Q2> 250 for 10
250 251 252 253 254 255 256 257 258 259
Q3> (250 for 10) tr 0-9 1-90
361 362 363 364 365 366 367 368 369 360
|
Input can be a pathname object:
| | Q4> ./Makefile wc
199 848 6895
|
In that case, no pipe or fork is needed: The file
is just opened for input, and the file descriptor is passed to
the program. This is standard input redirection.
Similarly, the output of a command can be saved as a string:
| | Q1> :S=(ls -ld ../test)
Q2> sprintf "(%#s)" S
("drwxrwxr-x 2 bothner 512 Jul 25 17:41 ../test\n")
|
(The format `%#s' means to print the argument in a form
that can be read back in, with appropriate escapes.)
Finally, the composition of two programs is a pipeline:
| | Q3> ls -ld ../test) tr a-zA-Z A-Za-z
DRWXRWXR-X 2 BOTHNER 512 jUL 25 17:41 ../TEST
|
Notice the unbalanced parenthesis; this is a convenience
that is allowed for interactive input only.
Generalized output redirection has the form:
This evaluates expression, but prints the result on filename.
The expression can be any expression, not just
ones that run programs:
For example:
| | Q4> >foo "2+4=$(2+4)\n"
Q5> cat foo
2+4=6
|
This document was generated
by Per Bothner on December, 4 2001
using texi2html