Remind
讓 remind 解釋 $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
指令在這種情況下不起作用,因為我需要就地生成包含的輸出。)
您的問題不在於 shell() 函式,而是
a)使用您嘗試插入表達式/變數的方式 - 您應該使用
[tmp]
而不是$tmp
remind
b)不允許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.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
預處理器)