If you actually want batch processing of stdin
and sending the result to stdout
, you can use the --script command line option to Emacs, which will enable you to write code that reads from stdin
and writes to stdout
and stderr
.
Here is an example program which is like cat
, except that it reverses each line:
#!/usr/local/bin/emacs --script
;;-*- mode: emacs-lisp;-*-
(defun process (string)
"just reverse the string"
(concat (nreverse (string-to-list string))))
(condition-case nil
(let (line)
;; commented out b/c not relevant for `cat`, but potentially useful
;; (princ "argv is ")
;; (princ argv)
;; (princ "
")
;; (princ "command-line-args is" )
;; (princ command-line-args)
;; (princ "
")
(while (setq line (read-from-minibuffer ""))
(princ (process line))
(princ "
")))
(error nil))
Now, if you had a file named stuff.txt
which contained
abcd
1234
xyz
And you invoked the shell script written above like so (assuming it is named rcat
):
rcat < stuff.txt
you will see the following printed to stdout:
dcba
4321
zyx
So, contrary to popular belief, you can actually do batch file processing on stdin
and not actually have to read the entire file in at once.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…