在一行中运行多个彼此分隔的 xdotool 命令

在一行中运行多个彼此分隔的 xdotool 命令

我尝试从“启动应用程序首选项”运行。 xdotool type word但如果我使用或,xdotool 会将其评估为输入的延续。xdotool key Return
&&;

答案1

长话短说:
使用脚本。

#! /bin/sh
# With some window selection magic, or a sleep 
# if you want to do that manually.
xdotool type word
xdotool key Return

并将脚本的路径放入Exec字段中。


很长的故事:

根据xdotool手册页

type
       Supports newlines and tabs (ASCII newline and tab). 
       With respect to "COMMAND CHAINING", this command consumes the
       remainder of the arguments and types them. That is, no commands can
       chain after 'type'.

;无法通过或进行命令链式连接&,因为这是 shell 语法,而启动应用程序不支持 shell 语法。但是,如果您只想Enter在输入内容后按下 ,则有一种迂回的方法可以做到这一点。

当它说“ASCII”换行符时,它并不意味着一个裸的\n。并且命令替换(xdotool type "$(printf '\n')"例如)会吃掉尾随的换行符。在此之后xdotools论坛帖子,我尝试了这个:

xdotool type "$(printf 'date\n ')"

并且成功了。但是它只在 之后有某个字符时才有效\n,这显然会留下一个尾随空格,这不是您想要的。我将其修改为:

xdotool type "$(printf 'date\n\e ')"

这样做确实有效,并且不会留下尾随空格。但是,这可能会给那些在 shell 中使用 Vi 模式的用户带来麻烦。

谢谢@steeldriver 的评论我发现这是因为我在执行命令的终端上尝试了它。我按下的按钮Enterxdotool命令之间只有一小段时间,就足以正确注册单个换行符。因此:

sleep 0.1; xdotool type $'date\n'

因此,可以通过引用来扩展该行:

xdotool type 'date
'

或者使用@steeldriver 建议的 shell 解释看起来是正确的选择。

但是,包含以下内容的脚本:

#! /bin/sh
sleep 1
xdotool type date
xdotool key Return

在现场Exec工作得很好。事实上,我总是建议在桌面文件中使用脚本来执行复杂的命令。

/usr/bin/xdotool您可以在 shebang 中使用脚本,但是手册页说“script模式尚未完全充实,可能达不到您的期望”,所以我坚持使用 bash 脚本。

我可能看错了,但在前几次尝试中,我不得不在和命令sleep之间typekey放置一个(小) 。这是在执行命令的终端上而不是另一个窗口上尝试的产物。

答案2

在我看来,应用程序并没有解析多个命令,而是将其视为单个命令。因此,通过将其包装为 shell 调用使其成为单个命令...

bash -c 'xdotool type date; xdotool key Return'

现在您还可以执行其他 shell 操作...

bash -c 'xdotool type "`date +"%Y-%m-%d_%T`"'

请注意,最后使用的“date”命令包含换行符!并且“xdotool”将输出它。

注意:如果您将其作为键盘宏执行,我还会向“xdotool”添加更多选项以使其更好地工作......

bash -c 'xdotool type --clearmodifiers -delay 0 "`date +"%Y-%m-%d_%T`"'

相关内容