Emuler le comportement de souris cut'n'paste dans un script de test

J'ai un script shell qui sort des commands shell qui sont censées être copiées avec la souris d'une window de terminal à l'autre (je peux cependant la tester dans la même window). La sortie ne doit contenir aucun caractère d'espace significatif autre que l'espace et les lignes de sortie doivent être tronquées afin que le code puisse être copié correctement même sur les terminaux où les sauts de ligne sont copiés en tant que sauts de ligne. Je voudrais m'assurer. Je pense à quelque chose comme ça:

$ 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* 

Émuler cela avec quelque chose comme xclip serait bien, si possible.

Le script devrait fonctionner sur un server Linux personnalisé qui n'a pas de X. Je ne sais pas comment en détail comment la sortie du terminal est envoyée au client, mais peut-être le script devrait requestr au server X du côté client ce qu'il est actuellement affichage?

xsel – manipule la sélection X

xsel --clipboard --input lit stdin dans le presse-papiers

xsel --clipboard --output écrit le contenu du presse-papiers vers le stdout

Voici un extrait de shell (non testé) qui devrait faire quelque chose de proche de ce que vous voulez, d'après ce que je comprends de votre question.

 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 

Comme je l'ai compris, vous devez réexécuter les commands exactement dans la même séquence que vous avez déjà effectuée depuis le début de la session. Droite?

Donc, la command d' history peut être utile ici. En fait, cela dépend de votre HISTFORMAT , mais si elle a la valeur par défaut, vous pouvez utiliser une command flag comme echo SOME_FLAG et utiliser:

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

qui va extraire les dernières commands depuis SOME_FLAG. Comment fonctionne sed ici:
H copy simplement le model actuel pour conserver le tampon
/SOME_FLAG/ regarde si la string correspond à SOME_FLAG
Si c'est le cas, il vérifie également s'il ne correspond pas à l' history (cela dépend aussi de votre shell stiings, parfois la command est déjà dans l'historique juste après l'exécution et histry y verra son input)
si elle correspond, supprimez toutes les inputs précédentes. et nous avons toutes les commands après le dernier drapeau SOME_FLAG.

Après cela, vous pouvez l'envoyer en shell via une pipe par exemple:

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

Malheureusement, c'est une méthode plutôt dangereuse: au cas où vous utiliseriez des commands avec suppression ou avec des données importantes, cela pourrait détruire quelque chose. Cependant, la méthode avec copyr-coller automatique avec simulation de souris peut causer des dommages similaires. Alors soyez prudent en utilisant cela.

Et il doit également définir le drapeau chaque fois que vous avez besoin de cette fonctionnalité.