是否可以在不执行命令的情况下将某些内容输入/粘贴到控制台?可以模拟正常Ctrl / Cmd + c
,Ctrl / Cmd + v
的内容,其中文本放在当前行而不执行,因此用户可以继续键入,删除等。
例如,我有以下简单的脚本:
#!/bin/bash
echo -n "foo" | pbcopy
pbpaste
现在当我运行它时,它只是回显foo%
并继续下一行。
此外,即使这样可行,我更喜欢一个适用于mac os和ubuntu的解决方案(据我所知,pbcopy并未在所有Linux发行版上预先安装)。
修改
编辑以更好地解释方案。想象一下,上面的脚本被称为foo.sh
。您运行脚本./foo.sh
,一旦完成,您将获得仅包含文本"foo"|
的新提示。 |
代表光标。
答案 0 :(得分:1)
所以......您已经了解了macOS中的pbcopy
和pbpaste
。您可能想知道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