从命令行打开 PDF 并返回命令行

从命令行打开 PDF 并返回命令行

我想从命令行打开带有 evince 的 PDF,在弹出 Evince 窗口后,我想返回终端命令并$等待下一个命令。

现在,如果我运行此命令,PDF 将在一个窗口中打开,当我返回终端时,我需要按 Enter 键才能等待$下一个命令。

$ evince foo.pdf &

知道如何防止需要第二次按 Enter 才能键入下一个命令吗?

我不关心关闭命令行后打开的窗口是否会关闭(即nohup不需要)。

我使用的是 bash 版本 5.1.16。

答案1

实际上不需要按回车键,可以直接使用终端。发生的情况是evince可以将各种消息打印到标准错误,因此这些使您的终端就像还没准备好一样。但是,您可以忽略它们并输入命令,您就会看到它的工作原理。

无论如何,我意识到这不太实用,所以你可以做的是将标准错误重定向到/dev/null

evince foo.pdf 2>/dev/null &

为了避免每次都写这个,你可以写一个小函数。将这些行添加到您的~/.bashrc(或其他 shell 的等效项)中:

evince(){
   command evince "$@" 2> /dev/null
}

这用作command获取 real 的一种方式evince,忽略函数名称,并将您使用的任何参数直接传递给函数 ( "$@"),将 stderr 重定向到 dev/null。

保存文件,打开一个新终端,然后您就可以按照evince您想要的方式使用了。

答案2

如果您使用 gnome,您可以使用:

xdg-open myfile

优点是这适用于任何类型的文件或目录,而且您不需要 ambersant 和重定向。

答案3

这是我经常使用的一种可能的工作流程。

我使用支持类似 HTML 的显式超链接(OSC 8 转义序列)的终端模拟器。有很多这样的终端模拟器。

我已经设置了aliaslsls --hyperlink=auto(以及一些其他与此处无关的选项)。请注意,它ls来自GNU coreutils大多数 Linux 系统上的默认设置,它具有此命令行选项。

我发出ls命令来打印给定的文件名。我可以使用通配符缩小列表范围,或者仅列出所需的文件名(借助制表符完成)。或者我可以简单地列出整个目录。或者,如果我知道它是目录中的最新文件之一,ls -ltr并且它将位于列表的末尾,我就不必记住它的名称。无论哪个感觉最方便,或者我当时想打字的那个。

然后,我按住 Ctrl 键并单击打印的链接(某些终端仿真器可能需要不同的操作才能打开链接),这将在其默认处理程序应用程序中打开该文件。

这样,我不需要记住默认应用程序的名称(无论是它evince还是其他名称),不需要键入该名称,也不需要键入通用的内容xdg-open或过于长的内容(如gapplication launch org.gnome.Evince上面的评论中所示)。

我的 PDF 和类似文件的名称中经常包含特殊字符(例如空格),这有点超出我的控制范围(我从网上下载其中许多文件或通过电子邮件等其他来源接收,而且我懒得重命名它们都只包含易于使用的字符)。此方法可以安全地处理此类字符,我不需要摆弄引用或转义。

默认应用程序在终端会话外部启动,也就是说,应用程序的标准输出或错误不会出现,也不会扰乱我的终端会话。

一个明显的缺点是它会启动给定文件类型的默认应用程序,我无法选择一次性例外。 (理论上可能有一个终端模拟器可以提供选择不同的应用程序,例如在其右键菜单中。我不知道是否有。)如果我需要使用不同的应用程序打开,我会诉诸更标准的应用程序方法。

我个人很喜欢这个方法,觉得超级快捷方便。你的旅费可能会改变。尝试一下,看看您是否喜欢。

相关内容