如何以编程方式粘贴到终端而不执行?

时间:2018-01-29 10:07:49

标签: bash terminal copy-paste

是否可以在不执行命令的情况下将某些内容输入/粘贴到控制台?可以模拟正常Ctrl / Cmd + cCtrl / Cmd + v的内容,其中文本放在当前行而不执行,因此用户可以继续键入,删除等。

例如,我有以下简单的脚本:

#!/bin/bash

echo -n "foo" | pbcopy

pbpaste

现在当我运行它时,它只是回显foo%并继续下一行。

此外,即使这样可行,我更喜欢一个适用于mac os和ubuntu的解决方案(据我所知,pbcopy并未在所有Linux发行版上预先安装)。

修改

编辑以更好地解释方案。想象一下,上面的脚本被称为foo.sh。您运行脚本./foo.sh,一旦完成,您将获得仅包含文本"foo"|的新提示。 |代表光标。

2 个答案:

答案 0 :(得分:1)

所以......您已经了解了macOS中的pbcopypbpaste。您可能想知道xclip,它是命令行中与X选择(“剪贴板”)类似的接口。

每个系统(Aqua和X)以不同方式处理剪贴板数据结构,我不知道任何单一工具将在这两个平台上以这种方式运行。也就是说,您可以编写可在两个系统之间移植的脚本:

#!/usr/bin/env bash

if type xclip >/dev/null; then
        clip_copy="xclip"
        clip_paste="xclip -o"
elif type pbcopy >/dev/null ; then
        clip_copy="pbcopy"
        clip_paste="pbpaste"
else
        echo "ERROR: no clipboard functions. Where am I?" >&2
        exit 1
fi

另请注意,pbcopy / pbpaste支持不同的数据类型,而xclip只处理文本。

也就是说,这两个函数都处理 stdin stdout 。如果您想实际模拟按键(如您的编辑似乎暗示的那样),则需要其他工具。

在Mac世界中,存在许多选项。 Cliclick适合我。此工具具有完整的鼠标支持,但也有一个选项t:,它将模拟键盘输入。可能cliclick t:"$(pbpaste)"似乎是合理的,尽管我从未尝试过它。

您还可以使用AppleScript打印任意文本:

$ osascript -e 'tell application "System Events" to keystroke "Hello world."'

在X中,xdotool似乎有效。

$ xdotool type "Hello world."

要制作可能在macOS和X环境中运行的脚本,您可以键入uname -s的输出:

#!/usr/bin/env bash

case "$(uname -s)" in
  Darwin)
    clip_copy="pbcopy"           # note: $clip_copy isn't used in this script.
    clip_paste="pbpaste"
    type_cmd="osascript -e 'tell application \"System Events\" to keystroke \"%s\"'"
    ;;
  *)
    clip_copy="xclip"
    clip_paste="xclip -o"
    type_cmd='xdotool type "%s"'
    ;;
esac

text="$($clip_paste)"

printf "$type_cmd" "${text//[!A-Za-z0-9. ]/}" | sh

注意:未经测试。因人而异。可能含有坚果。

答案 1 :(得分:0)

根据评论中的要点,我在堆栈交换中发现了一个线程,帮助我回答了我自己的问题:https://unix.stackexchange.com/a/213821

我只对支持sh,bash,zsh感兴趣,以便以下解决方案正常工作:

    for(i in jsontext) { row = jsontext[i] }

使用#!/bin/bash if [ "$(echo $ZSH_VERSION)" ]; then print -z $@ else # assume bash or sh bind '"\e[0n": "'"$*"'"'; printf '\e[5n' fi

进行通话