我正在尝试使用以下脚本:
#!/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