Если вы действительно хотите пакетную обработку stdin
и отправку результата в stdout
, вы можете использовать опцию командной строки - script для Emacs, которая позволит вам писать код, который читает из stdin
и пишет в stdout
и stderr
.
Вот пример программы, которая похожа на cat
, за исключением того, что она переворачивает каждую строку:
#!/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 "\n")
;; (princ "command-line-args is" )
;; (princ command-line-args)
;; (princ "\n")
(while (setq line (read-from-minibuffer ""))
(princ (process line))
(princ "\n")))
(error nil))
Теперь, если у вас есть файл с именем stuff.txt
, который содержит
abcd
1234
xyz
И вы вызвали скрипт оболочки, написанный выше, примерно так (при условии, что он называется rcat
):
rcat < stuff.txt
вы увидите следующее, напечатанное на стандартный вывод:
dcba
4321
zyx
Таким образом, вопреки распространенному мнению, вы можете на самом деле выполнять пакетную обработку файлов на stdin
, и на самом деле вам не нужно читать весь файл сразу.