让*提醒*解释*$shell()*的输出

让*提醒*解释*$shell()*的输出

提醒(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使用MSGin 表达式:

$ 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预处理器)

相关内容