从键盘快捷键启动终端,运行交互式命令并在 Ubuntu 17.10 中退出

从键盘快捷键启动终端,运行交互式命令并在 Ubuntu 17.10 中退出

我正在尝试执行以下操作:

  1. 从键盘快捷键打开 gnome 终端,例如 Ctrl+Shift+E。
  2. 在终端中运行命令。具体来说,命令是gio open $(fzf)。该命令是交互式的,并启动外部程序(例如 evince)。
  3. 一旦外部程序启动,关闭终端而不关闭外部程序。

对于上述第 2 步,我感兴趣的命令是gio open $(fzf):我使用模糊查找器选择一个文件fzf,然后该命令gio open使用 gnome 的默认程序打开该文件。

我可以逐一执行上述三个步骤:

  1. 我可以在设置中将键盘快捷键绑定到gnome-terminal:它会按预期打开终端。
  2. 然后我在新打开的终端中输入我的命令gio open $(fzf):如果我从中选择一个 pdf 文件fzf,它会打开 evince 并显示所选文件。
  3. 我可以输入 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-opengio 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

相关内容