【发布时间】:2018-07-31 04:27:57
【问题描述】:
我有一个简单的 shell 别名
alias fz='vim -p $(fzf -m)'
fzf 是一个交互式终端程序,只有在它终止时才会在标准输出上发送一个文件名列表。然后这用于打开用 vim 选择的文件。
现在的问题是当我决定取消并按下 ctrl+c 时,shell 继续前进并仍然打开 vim(好像我刚刚运行了 vim -p)。这种说法很有道理。
现在,解决我当前遇到的问题的一种方法是简单地使我的别名更复杂,这样如果 fzf 的输出为空,它就不会启动 vim。或者,如果 fzf 的退出代码不为零,我可能会做一些事情来中止启动 vim。
但是,我很好奇当我 Ctrl + C 时如何命令我的 shell 终止 fz。当我在子shell上下文中时,这根本不可能吗?我可以通过以某种方式设置进程组 ID 来做到这一点吗?
我尝试了set -m,但它并没有改变行为。
【问题讨论】:
-
我不确定,因为我还没有对此进行最终测试,但是,根据this answer,如果我将别名更改为脚本,它会做我想做的事。更新:这似乎不起作用。即使是
set -m。不过,我可以确认 pgid 与 shell 脚本版本正确设置。 -
文件名列表如何分隔? (也就是说,带有空格的文件名是如何表示的?)——在大多数情况下,这个别名不会与不寻常/令人惊讶的名称一起使用。
-
@CharlesDuffy 带有空格的文件名可能会破坏这一点,但这没关系(与问题的目的完全无关)。想象一下,如果我改用
find -print0和xargs -0 -
我不确定“更安全”是不是这个短语。这是一个能力连续体——与使用别名相比,您可以用函数做的事情范围更广,这仅取决于函数的工作方式(拥有自己的堆栈框架,被调用)使用不同的参数列表,而不是依赖字符串替换在结束后抛出东西)。而且,就此而言,您可以使用独立脚本中无法执行的函数执行大量操作(除非您使用
source调用该脚本)。 -
可能是这样的?
alias fz='F=$(fzf) && vim $F带预览版alias fz='F=$(fzf --preview "bat --style=numbers --color=always --line-range :500 {}") && vim $F'
标签: linux bash unix process posix