Tem * lembrar * interpretar a saída de * $ shell () *

1

lembrar (1) fornece uma função shell() documentada da seguinte forma:

   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.

          …

Gostaria que o que o s_cmd escrevesse para o stdout fosse interpretado por lembrar si mesmo. E. g .:

$ echo REM Sep 13 2018 MSG test >/tmp/test.rem
$ tail -2 ~/.reminders
SET tmp shell("cat /tmp/test.rem", -1)
$tmp

Onde $tmp é minha tentativa malsucedida de inserir a saída do comando na linha acima. Ao executar rem(1) , ele não retorna um erro, mas não interpola $tmp :

$ rem
Reminders for Thursday, 13th September, 2018 (today):

…
$tmp 

Eu assumo que $tmp é interpretado como uma declaração implícita de REM … .

(A diretiva INCLUDE não funciona neste contexto porque eu preciso a saída da inclusão a ser gerada in situ.)

    
por phg 13.09.2018 / 12:04

1 resposta

3

Seu problema não é com a função shell (), mas

a) com a maneira como você tenta interpolar expressões / variáveis - você deve usar [tmp] em vez de $tmp

b) com o fato de que remind não permite MSG em expressões:

$ 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.

Isto é o que a documentação diz:

  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!"]

Eu não sou um usuário lembrete, mas esta é minha primeira tentativa de corrigir seu problema:

SET tmp shell("cat /tmp/test.rem", -1)
REM [substr(tmp, 4, index(tmp, "MSG")-1)] MSG [substr(tmp, index(tmp, "MSG")+4)]

desde que /tmp/test.rem esteja no formato REM ... MSG ... .

Por favor, observe que, lembrando, os índices começam em 1, não em 0.

Nota

Se o seu problema é, na verdade, 'como incluir conteúdo gerado dinamicamente em um arquivo de lembrete', você pode fazer isso redirecionando a saída do comando shell para um arquivo temporário e INCLUINDO esse arquivo:

INCLUDE [shell("echo REM " + today() + " MSG hello > /tmp/foo.rem; echo /tmp/foo.rem")]

Ou você pode usar o comando INCLUDE com um fifo em vez de um arquivo normal e ter um script que escreve para o fifo toda vez que for aberto.

Antes de iniciar o reminder :

$ mkfifo /tmp/remind-fifo
$ while echo 'REM Sep 18 2018 MSG test' > /tmp/remind-fifo; do sleep 1; done &

Substitua o echo pelo script necessário para gerar os comandos de lembrete (por exemplo, sh my_script > /tmp/remind-fifo ).

Em seguida, no arquivo de lembrete, você pode simplesmente incluir o fifo:

INCLUDE /tmp/remind-fifo

A abordagem fifo pode ser usada com outros programas que tenham um mecanismo de inclusão (por exemplo, o pré-processador C )

    
por 18.09.2018 / 15:22

Tags