Como enviar texto para um comando e, em seguida, ler a partir do terminal

2

Gostaria de saber se é possível enviar alguns para o stdin de um comando e continuar lendo no terminal.

O problema que estou tentando resolver é executar algum código de inicialização toda vez que eu abro um REPL do Node.js, então eu tenho algumas funções disponíveis no REPL desde o início. Basicamente, para automatizar isso:

$ node
> require('./myutils')
> ... continue using the REPL

Eu agora eu posso usar aqui string para enviar algum texto para stdin do comando:

$ node <<<"require('./myutils')"

Isso executará meu código de inicialização, mas também fechará o REPL imediatamente depois disso.

Talvez exista outra solução para esse problema específico com o Node.js, mas gostaria de saber se há uma maneira geral de misturar a entrada de uma string ou arquivo e continuar lendo no terminal.

Atualização : a solução de Chris Down funciona, mas o REPL Node.js venceu não é executado no modo interativo por padrão (isso é esperado, já que não estamos lendo de um terminal). Felizmente, há uma opção -i para forçar o modo interativo no terminal Node.js:

{ echo "require('./myutils')" ; cat ; } | node -i
    
por epidemian 15.02.2013 / 03:33

2 respostas

6
{ echo "require('./myutils')" ; cat ; } | node

Esteja ciente de que seu ambiente REPL pode agir de maneira diferente ao receber entradas que não sejam de um terminal (por exemplo, o prompt pode não aparecer).

    
por 15.02.2013 / 04:31
2

Você pode usar o rlwrap (invólucro para o readline ) para interagir com um programa cujos recursos de interação não combinam com você.

rlwrap node

O Rlwrap não pode enviar a entrada inicial para o comando, mas chega perto: você pode colocar algum conteúdo inicial no buffer de entrada para que você tenha que pressionar Enter .

NODE_NO_READLINE=1 rlwrap -P"require('./myutils')" node

(A configuração NODE_NO_READLINE diz a node para não usar seu suporte embutido readline.)

    
por 16.02.2013 / 00:41