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 xclip
serí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 --input
lee stdin en el portapapeles
xsel --clipboard --output
escribir 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, history
el 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_FLAG
y 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 sed
funciona aquí?
H
Simplemente 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.