xsel < /tmp/xselection 在脚本中不起作用

xsel < /tmp/xselection 在脚本中不起作用

我正在尝试使用以下脚本:

#!/usr/bin/env bash
# Edit xselection in gvim
xsel > /tmp/xselection
gvim /tmp/xselection
xsel < /tmp/xselection

但最后一行似乎没有正确地将文件加载到 xselection 中。如果我在调用脚本后立即运行该行,它就会成功。我不明白为什么。我缺少什么?

答案1

您忽略了这样一个事实:在您退出 gvim 之前,对 gvim 的调用不会阻塞,它会立即返回。因此,xsel < /tmp/xselection在编辑文件之前会对其进行处理。

答案2

我最终合并了两个/所有三个答案的信息以生成以下内容:

#!/usr/bin/env bash
# Edit xselection in gvim

xsel > /tmp/xselection
gvim -f /tmp/xselection
xsel -i < /tmp/xselection

答案3

您需要使用该-i选项。 (-o是默认值)

xsel -i </tmp/xselection
# -o, --output   write the selection to standard output.  
# -i, --input   read standard input into the selection.*

这些选项适用于 X基本的选择(不是剪贴板),因此您需要居中单击才能查看结果。我在最终命令之前暂停了一下对其进行了测试。这允许我在执行最终命令之前手动选择一些其他文本。我单击了中心,效果很好......并且没有延迟。

然而,在没有延迟的情况下进行测试并不能证明什么,因为原始选择仍然被选中......当然,如果您同时选择其他内容,您将丢失脚本的主要选择。

也许您的问题是这两个选项以及 Paul Tomblin 关于与脚本过程分离的-i方式的回答的组合。gvim

答案4

我之前的答案变得有点拥挤并且不完整(并且只剩下一次编辑迭代)。所以这是一个修改后的答案,其中包括这两个想法......选项分离

正如我在 Giles 评论(之前的答案)的后续评论中提到的,-i在某些情况下(在测试 Ubuntu 系统上)肯定需要该选项..所以这里使用 -i和。-o

因为“gvim”与脚本进程分离,所以它不会等待,并且立即执行下一个命令。 (保罗·汤布林已经在他的回答中指出了这一点)。

你不能使用 bash 的wait命令,因为它只适用于子进程。作为解决方法,您可以设置一个循环来等待非儿童进程终止。这适用于每次都以新进程启动的编辑器(如本例中的“gvim”)。

这是修改后的脚本

xsel -o >/tmp/xselection

gvim /tmp/xselection 2>/dev/null
pid=$(pgrep -n "gvim")  # get gvim's pid and wait
while kill -0 "$pid" 2>/dev/null; do sleep 0.5; done

xsel -i </tmp/xselection

上面假设在控制权传回脚本时 gvim` pid 已经建立。如果在系统负载较高的情况下,执行下一个命令时 pid 尚未建立,那么这种等待 gvim 的方法应该有效。

xsel -o >/tmp/xselection

pre=$(pgrep -n gvim)    # get previous gvim pid
gvim /tmp/xselection 2>/dev/null
while pid=$(pgrep -n "gvim"); [[ "$pid" == "$pre" ]]; do sleep .1; done
while kill -0 "$pid" 2>/dev/null; do sleep 0.5; done

xsel -i </tmp/xselection

相关内容