Captura transcrição do programa com entrada e saída redirecionada

2

Uma interação típica para um programa que eu escrevi pode ter a seguinte aparência:

Enter command: a_command
Completed a command

Enter command: another_command
Completed another command

Eu normalmente executo meu programa como ./program < input.txt , onde input.txt conteria:

a_command
another_command

Eu quero ser capaz de capturar toda a interação (não apenas a saída) como acima. Como posso fazer isso com o bash?

EDIT: program é um binário (especificamente, é em C ++), não um script bash. Eu tenho acesso ao código-fonte, mas gostaria de fazer isso sem ter que modificar o código-fonte.

    
por karepker 16.04.2014 / 07:25

2 respostas

0

Para imprimir a entrada após o prompt correspondente, você precisa saber quando o programa está aguardando a entrada. Não há como dizer ao observar o programa em execução: você não consegue distinguir um programa que está esperando por entradas no stdin de um programa que está esperando por algo a mais (rede, disco, computação,…).

Assim, o processo para obter uma transcrição que se pareça com o uso interativo tem que ser assim:

  • Inicie o programa.
  • Aguarde - e reconheça - o primeiro aviso.
  • Exiba e envie a entrada para o primeiro prompt.
  • Idem com o segundo prompt de entrada e todos os subsequentes.
  • Sair quando o programa sair.

A ferramenta padrão de fato para roteirizar isso é Esperar . O script seria algo como isto (aviso: não funciona código, digitado diretamente no meu navegador):

#!/usr/bin/expect -f
set transcript_file [open "transcript" wb]
spawn myprogram
expect "Enter command:"
puts -nonewline $transcript_file $expect_out(buffer)
send "a_command\r"
puts -nonewline $transcript_file "a_command\r"
puts -nonewline $transcript_file $expect_out(buffer)
send "another_command\r"
puts -nonewline $transcript_file "another_command\r"
puts -nonewline $transcript_file $expect_out(buffer)
…
expect eof
close $transcript_file
    
por 17.04.2014 / 02:42
0

Adicione a linha set -x no seu arquivo de programa.

Exemplo:

#!/bin/bash
set -x #echo on

ls $PWD

Isso expande todas as variáveis e imprime os comandos completos antes da saída do comando.

saída:

+ ls /home/user/
file1.txt file2.txt

Verifique se esta resposta do Stackoverflow para sinalizadores mais semelhantes para o comando set.

    
por 16.04.2014 / 10:42