我想从命令行打开带有 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 转义序列)的终端模拟器。有很多这样的终端模拟器。
我已经设置了alias
从ls
到ls --hyperlink=auto
(以及一些其他与此处无关的选项)。请注意,它ls
来自GNU coreutils
大多数 Linux 系统上的默认设置,它具有此命令行选项。
我发出ls
命令来打印给定的文件名。我可以使用通配符缩小列表范围,或者仅列出所需的文件名(借助制表符完成)。或者我可以简单地列出整个目录。或者,如果我知道它是目录中的最新文件之一,ls -ltr
并且它将位于列表的末尾,我就不必记住它的名称。无论哪个感觉最方便,或者我当时想打字的那个。
然后,我按住 Ctrl 键并单击打印的链接(某些终端仿真器可能需要不同的操作才能打开链接),这将在其默认处理程序应用程序中打开该文件。
这样,我不需要记住默认应用程序的名称(无论是它evince
还是其他名称),不需要键入该名称,也不需要键入通用的内容xdg-open
或过于长的内容(如gapplication launch org.gnome.Evince
上面的评论中所示)。
我的 PDF 和类似文件的名称中经常包含特殊字符(例如空格),这有点超出我的控制范围(我从网上下载其中许多文件或通过电子邮件等其他来源接收,而且我懒得重命名它们都只包含易于使用的字符)。此方法可以安全地处理此类字符,我不需要摆弄引用或转义。
默认应用程序在终端会话外部启动,也就是说,应用程序的标准输出或错误不会出现,也不会扰乱我的终端会话。
一个明显的缺点是它会启动给定文件类型的默认应用程序,我无法选择一次性例外。 (理论上可能有一个终端模拟器可以提供选择不同的应用程序,例如在其右键菜单中。我不知道是否有。)如果我需要使用不同的应用程序打开,我会诉诸更标准的应用程序方法。
我个人很喜欢这个方法,觉得超级快捷方便。你的旅费可能会改变。尝试一下,看看您是否喜欢。