在测试脚本中模拟鼠标剪切和粘贴行为

在测试脚本中模拟鼠标剪切和粘贴行为

我有一个 shell 脚本,它输出应该是的 shell 命令用鼠标复制粘贴从一个终端窗口到另一个终端窗口(不过我可以在同一个窗口中测试它)。输出应该除纯空格外不包含任何重要的空白字符,并且输出行应该被截断,以便即使在将软换行符复制为硬换行符的终端上也可以正确复制代码。我想确定一下。我在想这样的事情:

$ 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会很好。

该脚本应该在没有 X 的自定义 Linux 服务器上运行。我不知道如何详细地将终端输出发送到客户端,但也许该脚本必须询问客户端的 X 服务器当前是什么显示?

答案1

xsel- 操纵 X 选择。

xsel --clipboard --input将标准输入读入剪贴板

xsel --clipboard --output将剪贴板的内容写入标准输出

答案2

这是一个 shell 片段(未经测试),根据我对你的问题的理解,它应该做一些接近你想要的事情。

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和 use :

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(这也取决于您的 shell stings,有时命令在执行后就已经在历史记录中,并且历史记录将在其中看到它的条目)
如果匹配则删除所有以前的条目。我们有最后一个 SOME_FLAG 标志之后的所有命令。

之后,您可以通过管道将其发送到 shell,例如:

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

不幸的是,这是非常危险的方法:如果您使用某些命令删除或修改重要数据,它可能会破坏某些内容。然而,使用鼠标模拟自动复制和粘贴的方法可能会造成类似的损害。所以使用这个时要小心。

每次需要此功能时还需要设置标志。

相关内容