Estou escrevendo um script de shell que executa um script Python. O script Python é interrompido para que uma entrada manual seja fornecida. No entanto, não quero ter que pressionar Enter todas as vezes no script. Em vez disso, quero passar a entrada manual do script de shell em execução.
Por favor, ajude, se existe uma maneira de fazer isso?
Responder1
Se houver apenas uma entrada necessária, basta usar echo
e um pipe:
echo | python script.py
echo
imprime uma linha vazia (com nova linha) na saída padrão e então a redirecionamos para a entrada do script Pythonusando|
. Quando o Python lê a entrada padrão, ele obtém uma linha vazia e continua.
Se o script desejar mais de um pressionamento de enter, você poderá usar oyes
comandoe um cachimbo:
yes "" | python script.py
O yes
comando imprime a mesma linha na saída padrão continuamente. Por padrão, a string é y
, mas aqui a tornamos uma string vazia, então são apenas novas linhas para sempre.
Se a entrada for necessária como resposta a um prompt específico e em outros momentos você precisar de uma entrada diferente, useexpect
, que é "uma extensão Tcl que permite automatizar interações com programas interativos".
É possível escrever seu script de shell para que ele leia a saída do Python e produza uma nova entrada para ele, mas eu não recomendo isso especialmente. Se você quiser fazer isso, vejaRedirecionamento IO no Guia avançado de script Bash: você precisará clonar descritores de arquivo para fazer isso. Você também pode usarmkfifo
e crie arquivos de pipe nomeados e, em seguida, leia-os e grave-os normalmente.
Para ser honesto, eu começaria a pensar em abordagens alternativas se você estiver chegando ao ponto de fazer uma dessas abordagens: o shell script simplesmente não foi criado para isso e será muito mais simples escrever seu script, digamos, O próprio Python.