Эмулировать поведение мыши при копировании и вставке в тестовом скрипте

Эмулировать поведение мыши при копировании и вставке в тестовом скрипте

У меня есть скрипт оболочки, который выводит команды оболочки, которые должны бытьскопировано-вставлено с помощью мышииз одного терминального окна в другое (хотя я могу проверить это в том же окне). Выводдолженне содержат никаких значимых пробельных символов, кроме обычного пробела, а выходные строкидолженбыть усечен, чтобы код можно было правильно скопировать даже на терминалах, где мягкие переносы строк копируются как жесткие переносы строк. Я хотел бы убедиться. Я думаю что-то вроде этого:

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

xclipБыло бы неплохо, если бы это было возможно, сымитировать это с помощью чего-то похожего .

Скрипт должен работать на пользовательском сервере Linux, на котором нет X. Я не знаю подробностей, как вывод терминала отправляется клиенту, но, возможно, скрипт должен будет спрашивать X-сервер на стороне клиента, что он в данный момент отображает?

решение1

xsel- манипулировать выделением X.

xsel --clipboard --inputсчитывает stdin в буфер обмена

xsel --clipboard --outputзаписать содержимое буфера обмена в stdout

решение2

Вот фрагмент оболочки (непроверенный), который должен делать что-то близкое к тому, что вам нужно, насколько я понимаю ваш вопрос.

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

решение3

Насколько я понял, вам нужно повторить команды в той же последовательности, в которой вы уже это делали с начала сеанса. Верно?

Так что может быть historyкоманда здесь полезна. На самом деле это зависит от вашего HISTFORMAT, но если у него есть значение по умолчанию, вы можете использовать какую-нибудь команду-флаг, например, echo SOME_FLAGи использовать :

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

который извлечет последние команды с SOME_FLAG. Как это sedработает здесь:
Hпросто копирует текущий шаблон для хранения буфера,
/SOME_FLAG/отслеживает, соответствует ли строка SOME_FLAG,
если соответствует, то также проверяет, не соответствует ли history(это также зависит от настроек вашей оболочки, иногда команда уже находится в истории сразу после выполнения, и история увидит ее запись в ней),
если соответствует, то удаляет все предыдущие записи. и у нас есть все команды после последнего флага SOME_FLAG.

После этого вы можете отправить его в оболочку через канал, например:

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

К сожалению, это довольно опасный метод: если вы используете некоторые команды с удалением или с изменением важных данных, это может что-то уничтожить. Однако метод с автоматическим копированием и вставкой с имитацией мыши может нанести похожий ущерб. Так что будьте осторожны, используя его.

И также необходимо устанавливать флаг каждый раз, когда вам нужна эта функция.

Связанный контент