我正在尝试执行以下操作:
- 从键盘快捷键打开 gnome 终端,例如 Ctrl+Shift+E。
- 在终端中运行命令。具体来说,命令是
gio open $(fzf)
。该命令是交互式的,并启动外部程序(例如 evince)。 - 一旦外部程序启动,关闭终端而不关闭外部程序。
对于上述第 2 步,我感兴趣的命令是gio open $(fzf)
:我使用模糊查找器选择一个文件fzf
,然后该命令gio open
使用 gnome 的默认程序打开该文件。
我可以逐一执行上述三个步骤:
- 我可以在设置中将键盘快捷键绑定到
gnome-terminal
:它会按预期打开终端。 - 然后我在新打开的终端中输入我的命令
gio open $(fzf)
:如果我从中选择一个 pdf 文件fzf
,它会打开 evince 并显示所选文件。 - 我可以输入 Ctrl+D 来关闭终端。这样做不是关闭 evince。这是预期的行为。
并且手动完成这三个步骤即可。
我的目标是使上述操作自动化。它应该按如下方式工作。当我输入键盘快捷键 Ctrl+Shit+E(或任何其他快捷键)时,gnome 终端应该打开,并且gio open $(fzf)
应该运行命令。一旦交互式命令完成(打开外部程序,如 evince),终端应该自动关闭,而不会关闭 evince。
我尝试过。
- 使用该命令添加键盘快捷键
gnome-terminal -- bash -c "gio open $(fzf)"
不起作用。按下组合键没有任何作用。 - 如果我
gio open $(fzf)$
在 .bashrc 末尾添加该命令,则使用命令的键盘快捷键gnome-terminal
将打开终端并运行该命令。只要我选择一个 pdf 文件,evince 就会打开所选文件(耶!!!)。但是,如果我按下 Ctrl+D,终端就会关闭,evince 也会关闭(可能是因为 evince 是一个子进程?)。 gio open $(fzf)$ && exit
如果我在 .bashrc 末尾添加命令,则带有该命令的键盘快捷键gnome-terminal
将打开终端并运行该命令,但是只要我选择一个文件,终端就会关闭而不会打开 evince(evince 可能已启动并立即关闭,我无法判断)。
请注意,使用 .bashrc 主要是为了测试目的,我想避免污染我的 .bashrc。
答案1
但是,如果我按下 Ctrl+D,终端就会关闭,evince 也会关闭(可能是因为 evince 是一个子进程?)
是的,当然,它是子进程,您应该以“分离”方式运行此进程。之后,您可以结束主进程(在您的情况下是终端)。
这是有关如何运行分离进程的详细答案。
https://superuser.com/questions/178587/how-do-i-detach-a-process-from-terminal-entirely
另外,您可以使用下一个快捷方式:
bash -c "some_command" > /dev/null &2>&1
在这种情况下,终端窗口根本不会出现,并且您不需要在 .bashrc 文件中添加任何内容。
答案2
同样的事情也困扰着我,所以我来回答这个老问题。我发现这种脚本xdg-open
有gio open
问题,我也注意到 gnome-terminal 也有问题。例如,xdg-open 可以打开 gedit 来编辑文本文件,但不能打开 evince 来查看 pdf。所以我使用以下脚本xterm -e
。请注意,这会将 nohup.out 文件留在您的主目录中,如果这让您感到困扰,您可以重定向 stdout。
#!/bin/bash
file="$(fzf)"
[ - n "$file" ] || exit 1
end="${file##*.}"
case $end in
pdf | djvu | ps )
exec nohup evince "$file"
;;
* )
exec nohup xdg-open "$file"
;;
esac