Emulieren des Ausschneiden-und-Einfügen-Verhaltens der Maus in einem Testskript

Emulieren des Ausschneiden-und-Einfügen-Verhaltens der Maus in einem Testskript

Ich habe ein Shell-Skript, das Shell-Befehle ausgibt, die eigentlichMit der Maus kopieren und einfügenvon einem Terminalfenster in ein anderes (ich kann es jedoch im selben Fenster testen). Die Ausgabesollenkeine signifikanten Leerzeichen außer dem einfachen Leerzeichen enthalten, und die Ausgabezeilensollenabgeschnitten werden, damit der Code auch auf Terminals, auf denen weiche Zeilenumbrüche als harte Zeilenumbrüche kopiert werden, richtig kopiert werden kann. Ich möchte sichergehen. Ich denke an so etwas wie das hier:

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

xclipWenn möglich, wäre es schön, dies mit etwas wie diesem zu emulieren .

Das Skript sollte auf einem benutzerdefinierten Linux-Server ausgeführt werden, auf dem kein X läuft. Ich weiß nicht im Detail, wie die Terminalausgabe an den Client gesendet wird, aber vielleicht müsste das Skript den X-Server auf der Clientseite fragen, was er gerade anzeigt?

Antwort1

xsel- die X-Auswahl manipulieren.

xsel --clipboard --inputliest stdin in die Zwischenablage

xsel --clipboard --outputInhalt der Zwischenablage nach Standardausgabe schreiben

Antwort2

Hier ist ein Shell-Snippet (ungetestet), das, soweit ich Ihre Frage richtig verstehe, ungefähr das tun sollte, was Sie wollen.

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

Antwort3

So wie ich es verstanden habe, müssen Sie die Befehle in genau derselben Reihenfolge erneut ausführen, wie Sie es seit Beginn der Sitzung getan haben. Richtig?

Vielleicht historyist dieser Befehl hier nützlich. Eigentlich hängt es von Ihnen ab HISTFORMAT, aber wenn er einen Standardwert hat, können Sie einen Flag-Befehl wie echo SOME_FLAGdiesen verwenden:

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

das extrahiert die letzten Befehle seit SOME_FLAG. Wie es sedhier funktioniert:
Hkopiert einfach das aktuelle Muster in den Zwischenspeicher
/SOME_FLAG/und überwacht, ob die Zeichenfolge mit SOME_FLAG übereinstimmt.
Wenn dies der Fall ist, wird auch geprüft, ob dies nicht der Fall ist history(hängt auch von Ihren Shell-Einstellungen ab, manchmal ist der Befehl direkt nach der Ausführung bereits im Verlauf und der Verlauf sieht seinen Eintrag darin).
Wenn er übereinstimmt, werden alle vorherigen Einträge gelöscht. Und wir haben alle Befehle nach dem letzten SOME_FLAG-Flag.

Anschließend können Sie es beispielsweise per Pipe an die Shell senden:

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

Leider ist dies eine ziemlich gefährliche Methode: Wenn Sie Befehle zum Löschen oder Ändern wichtiger Daten verwenden, kann dies zu einer Zerstörung führen. Die Methode mit automatischem Kopieren und Einfügen mit Maussimulation kann jedoch ähnliche Schäden verursachen. Seien Sie also vorsichtig bei der Verwendung dieser Methode.

Außerdem muss jedes Mal eine Flagge gesetzt werden, wenn Sie diese Funktion benötigen.

verwandte Informationen