提醒(1)shell()
提供了一个记录如下的函数:
shell(s_cmd [,i_maxlen])
Executes cmd as a system command, and returns the first 511
characters of output resulting from cmd. Any whitespace
character in the output is converted to a space. Note that if
RUN OFF has been executed, or the -r command-line option has
been used, shell() will result in an error, and cmd will not be
executed.
…
我希望s_cmd
写入标准输出的任何内容都由提醒本身。例如:
$ echo REM Sep 13 2018 MSG test >/tmp/test.rem
$ tail -2 ~/.reminders
SET tmp shell("cat /tmp/test.rem", -1)
$tmp
$tmp
我在上面的行中插入命令输出的失败尝试在哪里?执行时rem(1)
,它不会返回错误,但也不进行插值$tmp
:
$ rem
Reminders for Thursday, 13th September, 2018 (today):
…
$tmp
我认为这$tmp
被解释为隐含的REM …
陈述。
(该INCLUDE
指令在这种情况下不起作用,因为我需要就地生成包含的输出。)
答案1
你的问题不在于 shell() 函数,而是
a)尝试插入表达式/变量的方式——你应该使用[tmp]
而不是$tmp
b) 不允许remind
使用MSG
in 表达式:
$ cat /tmp/foo.rem
SET var "REM Sep 13 2018 MSG test"
[var]
$ remind /tmp/foo.rem
/tmp/foo.rem(2): Can't nest MSG, MSF, RUN, etc. in expression
No reminders.
文档是这样说的:
o You cannot use expression-pasting to determine the type (MSG, CAL, etc.) of a REM command. You can paste expressions before and after the MSG, etc keywords, but cannot do something like this: REM ["12 Nov 1993 AT 13:05 " + "MSG" + " BOO!"]
我不是提醒用户,但这是我解决您的问题的第一次尝试:
SET tmp shell("cat /tmp/test.rem", -1)
REM [substr(tmp, 4, index(tmp, "MSG")-1)] MSG [substr(tmp, index(tmp, "MSG")+4)]
前提/tmp/test.rem
是形式为REM ... MSG ...
.
请注意,在提醒中,索引从 1 开始,而不是从 0 开始。
笔记
如果您的问题实际上是“如何在提醒文件中包含动态生成的内容”,您可以通过将 shell 命令的输出重定向到临时文件,然后包含该文件来实现此目的:
INCLUDE [shell("echo REM " + today() + " MSG hello > /tmp/foo.rem; echo /tmp/foo.rem")]
或者,您可以将该INCLUDE
命令与 fifo 而不是常规文件一起使用,并使用一个脚本在每次打开 fifo 时写入该文件。
在开始之前reminder
:
$ mkfifo /tmp/remind-fifo
$ while echo 'REM Sep 18 2018 MSG test' > /tmp/remind-fifo; do sleep 1; done &
将 替换echo
为生成提醒命令所需的任何脚本(例如sh my_script > /tmp/remind-fifo
)。
然后,在提醒文件中,您可以简单地包含 fifo:
INCLUDE /tmp/remind-fifo
fifo 方法可以与具有包含机制的其他程序一起使用(例如C
预处理器)