Remind

remind 解釋 $shell() 的輸出

  • September 24, 2018

*提醒(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指令在這種情況下不起作用,因為我需要就地生成包含的輸出。)

您的問題不在於 shell() 函式,而是

a)使用您嘗試插入表達式/變數的方式 - 您應該使用[tmp]而不是$tmp

remindb)不允許MSG在表達式中使用的事實:

$ 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.remREM ... 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預處理器)

引用自:https://unix.stackexchange.com/questions/468756