У меня есть скрипт оболочки, который выводит команды оболочки, которые должны бытьскопировано-вставлено с помощью мышииз одного терминального окна в другое (хотя я могу проверить это в том же окне). Выводдолженне содержат никаких значимых пробельных символов, кроме обычного пробела, а выходные строкидолженбыть усечен, чтобы код можно было правильно скопировать даже на терминалах, где мягкие переносы строк копируются как жесткие переносы строк. Я хотел бы убедиться. Я думаю что-то вроде этого:
$ 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
К сожалению, это довольно опасный метод: если вы используете некоторые команды с удалением или с изменением важных данных, это может что-то уничтожить. Однако метод с автоматическим копированием и вставкой с имитацией мыши может нанести похожий ущерб. Так что будьте осторожны, используя его.
И также необходимо устанавливать флаг каждый раз, когда вам нужна эта функция.