Emular o comportamento de recortar e colar do mouse em um script de teste

Emular o comportamento de recortar e colar do mouse em um script de teste

Eu tenho um script de shell que gera comandos de shell que deveriam sercopie e cole com o mousede uma janela de terminal para outra (posso testá-lo na mesma janela). A saídadevenão contém nenhum caractere de espaço em branco significativo além do espaço simples, e as linhas de saídadeveser truncado para que o código possa ser copiado corretamente, mesmo em terminais onde as quebras de linha suaves são copiadas como quebras de linha rígidas. Eu gostaria de ter certeza. Estou pensando em algo assim:

$ eval `resize -s 24 80`
$ reset
$ my_script
$ mouse_copy *all of the terminal history except for the first line*
$ mouse_paste
$ assert *the paste created the proper result*

Emular isso com algo parecido xclipseria bom, se possível.

O script deve ser executado em um servidor Linux personalizado que não possui X. Não sei detalhadamente como a saída do terminal é enviada ao cliente, mas talvez o script tenha que perguntar ao servidor X no lado do cliente o que é atualmente exibindo?

Responder1

xsel- manipular a seleção X.

xsel --clipboard --inputlê stdin na área de transferência

xsel --clipboard --outputgravar o conteúdo da área de transferência em stdout

Responder2

Aqui está um trecho de shell (não testado) que deve fazer algo próximo ao que você deseja, pelo que entendi da sua pergunta.

set -e
# Collect the output of the script in a variable
script_output=$(my_script)
# Check that the script output is nice and copypastable
awk '
    /[^[:print:]]/ { print NR ": non-printable character"; exit 1 }
    / $/ { print NR ": trailing whitespace"; exit 1 }
    /.{79}/ { print NR ": line too long"; exit 1 }
' <<EOF
$script_output
EOF

# Use expect to spawn a shell, feed it the script output, and
# check the result against expectations
export script_output
expect <<'EOF'
spawn sh
send "[array get env script_output]\n"
expect "the proper result"
EOF

Responder3

Pelo que entendi, você precisa executar novamente os comandos exatamente na mesma sequência que já fez desde o início da sessão. Certo?

Portanto, historyo comando pode ser útil aqui. Na verdade depende do seu HISTFORMAT, mas se tiver valor padrão você pode usar algum comando de flag como echo SOME_FLAGe usar:

history | sed -n 'H;/SOM_FLAG/{/history/!{x;d}};${x;s/\n\s\+[0-9]*\s\+/\n/g;p}'

que extrairá os últimos comandos desde SOME_FLAG. Como funciona sedaqui:
Hapenas copia o padrão atual para manter
/SOME_FLAG/as inspeções de buffer se a string corresponder a SOME_FLAG,
se corresponder, também verifica se não corresponde history(também depende das configurações do seu shell, às vezes o comando já está no histórico logo após a execução e o histórico verá sua entrada nele)
se corresponder, exclua todas as entradas anteriores. e temos todos os comandos após o último sinalizador SOME_FLAG.

Depois disso você pode enviá-lo para o shell via pipe, por exemplo:

history | sed -n 'H;/man/{/history/!{x;d}};${x;s/\n\s\+[0-9]*\s\+/\n/g;p}' | bash -x

Infelizmente é um método bastante perigoso: caso você esteja usando alguns comandos para deletar ou modificar dados importantes, ele pode destruir alguma coisa. No entanto, o método de copiar e colar automático com simulação de mouse pode causar danos semelhantes. Portanto, tome cuidado ao usar isso.

E também precisa definir um sinalizador sempre que você precisar desse recurso.

informação relacionada