Emular el comportamiento de cortar y pegar del mouse en un script de prueba

Emular el comportamiento de cortar y pegar del mouse en un script de prueba

Tengo un script de shell que genera comandos de shell que se supone que soncopiar y pegar con el mousede una ventana de terminal a otra (aunque puedo probarlo en la misma ventana). La salidadeberíano contiene ningún carácter de espacio en blanco significativo que no sea espacio simple, y las líneas de salidadeberíatruncarse para que el código se pueda copiar correctamente incluso en terminales donde los saltos de línea suaves se copian como saltos de línea duros. Me gustaría asegurarme. Estoy pensando en algo como esto:

$ 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 esto con algo como xclipsería bueno, si es posible.

El script debe ejecutarse en un servidor Linux personalizado que no tiene X. No sé en detalle cómo se envía la salida del terminal al cliente, pero tal vez el script tendría que preguntarle al servidor X en el lado del cliente cuál es actualmente. mostrando?

Respuesta1

xsel- manipular la selección X.

xsel --clipboard --inputlee stdin en el portapapeles

xsel --clipboard --outputescribir el contenido del portapapeles en la salida estándar

Respuesta2

Aquí hay un fragmento de shell (no probado) que debería hacer algo parecido a lo que desea, según tengo entendido de su pregunta.

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

Respuesta3

Según tengo entendido, es necesario volver a ejecutar los comandos exactamente en la misma secuencia que ya lo hizo desde el comienzo de la sesión. ¿Bien?

Entonces, historyel comando puede ser útil aquí. En realidad depende de tu HISTFORMAT, pero si tiene un valor predeterminado, puedes usar algún comando de bandera como echo SOME_FLAGy usar:

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

eso extraerá los últimos comandos desde SOME_FLAG. ¿Cómo sedfunciona aquí?
HSimplemente copia el patrón actual para mantener
/SOME_FLAG/las vigilancias del búfer si la cadena coincide con SOME_FLAG,
si lo hace, también verifica si no coincide history(también depende de las funciones de Shell, a veces el comando ya está en el historial justo después de la ejecución y histry verá su entrada en él)
si coincide, elimine todas las entradas anteriores. y tenemos todos los comandos después del último indicador SOME_FLAG.

Después de eso, puedes enviarlo al shell a través de una tubería, por ejemplo:

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

Desafortunadamente, es un método bastante peligroso: en caso de que esté utilizando algunos comandos para eliminar o modificar datos importantes, puede destruir algo. Sin embargo, el método de copiar y pegar automáticamente con simulación del mouse puede causar daños similares. Así que ten cuidado al usar esto.

Y también es necesario establecer una bandera cada vez que necesite esta función.

información relacionada