알림(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) in 표현식은 remind
허용 되지 않습니다 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 ...
.
알림에서 인덱스는 0이 아닌 1에서 시작합니다.
노트
질문이 실제로 "알림 파일에 동적으로 생성된 콘텐츠를 포함하는 방법"인 경우 셸 명령의 출력을 임시 파일로 리디렉션한 다음 해당 파일을 포함하여 이를 달성할 수 있습니다.
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
전처리기) 이 있는 다른 프로그램과 함께 사용할 수 있습니다.