`open` 命令在应用程序中打开文件

Edg*_*ira 18 command-line file-opening

为什么我不能在我的终端中运行这个命令:

open index.html
Run Code Online (Sandbox Code Playgroud)

不是应该在我的浏览器上打开这个文件吗?我也不能运行这个命令:open index.html -a "Sublime Text". 这些命令的结果是:

$ open index.html
Couldn't get a file descriptor referring to the console

$ open index.html -a "Sublime Text" - 
open: invalid option -- 'a' 
Usage: open [OPTIONS] -- command
Run Code Online (Sandbox Code Playgroud)

Gil*_*il' 27

OS Xopen命令的主要目的是在关联的应用程序中打开文件。在现代非 OSX unices 上的等价物是xdg-open.

xdg-open index.html
Run Code Online (Sandbox Code Playgroud)

xdg-open没有等效于 OSX 的open -a在特定应用程序中打开文件。这是因为在应用程序中打开文件的正常方法是简单地键入应用程序的名称,后跟文件的名称。更准确地说,您需要键入实现应用程序的可执行程序的名称。

sublime_text index.html
Run Code Online (Sandbox Code Playgroud)

Linux 与其他 Unix 系统(但据我所知不是 OS X 的非 Unixy 部分)一样,通过使用包管理器跟踪软件来管理软件,并将单个文件放在使用它们的地方。例如,所有可执行程序都位于一小组目录中,所有这些目录都列在PATH变量中;runningsublime_text查找sublime_text在 中列出的目录中调用的文件PATH。OS X 需要一个额外的间接级别,通过open -a,来处理在单个目录树中解压缩并在应用程序数据库中注册的应用程序。Linux 没有任何应用程序数据库,但它的组织方式不需要任何应用程序数据库。

如果运行命令sublime_textshell 对您不起作用,则说明 Sublime Text 未正确安装。我从未使用过它,而且显然它是作为 tar 存档提供的,而不是作为分发包(例如 deb 或 rpm),因此您可能需要执行额外的安装步骤。Sublime Text 的制作者的工作就是让这个自动化,但如果他们还没有这样做,你可以通过运行命令自己来做

sudo -s …/sublime_text /usr/local/bin
Run Code Online (Sandbox Code Playgroud)

当然,替换sublime_text可执行文件所在的路径。

open您遇到的命令是该命令的旧名称openvt(某些 Linux 发行版仅将其包含在名称下openvt)。该openvt命令创建了一个新的虚拟控制台,它只能由 root 完成,并且在本世纪不经常使用,因为大多数人只在图形窗口环境中工作。


Mar*_*rco 7

你没有提到你正在使用的操作系统。

在某些 Linux 发行版上,该open命令是指向该命令的符号链接,该 openvt命令在新的虚拟控制台中打开二进制文件。这显然不是你想要的。您的错误消息确实表明您调用了该openvt命令。此命令需要一个程序二进制文件(可执行文件)作为参数。

我假设你的意思xdg-open是,与 相比openvt,它不期望一个可执行文件作为参数,而是一个与程序相关联并用程序打开文件的文件。您可以将文件和 URL 作为参数传递。

因此xdg-open index.html应该在浏览器中 xdg-open image.png打开文件,在图像查看器中打开文件等。


rie*_*333 5

尽管人们经常将其命名xdg-open为模拟 的功能open,但 macOSopen有点不同,因为它 1. 不会从 stdout/stedrr 重定向任何内容,2. 分离您想要从终端运行的任何内容(这几乎总是您在启动 GUI 时想要的)应用程序,这样您就没有终端了)

为了解决这个问题,我使用一些标准的 GNU 工具想出了一个适当的等效方法(语法是 Fish shell,但转换为 bash 是微不足道的):

function open
    for i in $argv
        setsid nohup xdg-open $i > /dev/null 2> /dev/null
    end
end
Run Code Online (Sandbox Code Playgroud)

添加

对于那些使用 bash shell 的人来说,以下是该函数:

open ()
{
    for i in $*
    do
        setsid nohup xdg-open $i > /dev/null 2> /dev/null
    done
}
Run Code Online (Sandbox Code Playgroud)