*알림*이 *$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) 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전처리기) 이 있는 다른 프로그램과 함께 사용할 수 있습니다.

관련 정보