linux - 系统如何在需要时调用可移植应用程序(例如文件关联)?

标签 linux macos portable-executable file-association portable-applications

Linux 中有一些可移植应用程序的实现,但似乎所有 Mac OS X 应用程序都是可移植的。由于 Mac OS X 完全支持此模型,我假设他们已经找到了解决此问题的方法。

由于 Windows 通过将文件放在各处并更改注册表中的内容来“安装”应用程序,因此可以轻松地进行文件关联。但是,假设我刚刚下载了适用于 Mac OS X(或其他)的 MPlayer。我希望我的所有电影都能在 MPlayer 中打开。然后,我决定移动 MPlayer 的应用程序包(嘿,它是可移植的,对吧?)。协会会破裂吗?或者 OS X 上根本就不是这样的?

如何在 Linux 中实现可移植应用程序?它应该类似于 OS X 的模型吗?我知道这是一个非常开放式的问题,但任何建议都会受到赞赏。

最佳答案

OS X 的启动服务数据库以多种方式跟踪文档绑定(bind) — 通常,即使您移动了应用程序,它也会尽力尝试匹配该应用程序。

您可以运行lsregister -dump(lsregister/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister) 以查看启动服务数据库对绑定(bind)的说明。例如,如果我绑定(bind)文本文件以使用 TextWrangler 打开,我会看到:

handler id:            3124
    content type:  public.plain-text
    options:       
    all roles:     com.barebones.textwrangler (0x3ea30180)

public.plain-textUniform Type Identifier (映射到一个或多个文件扩展名、MIME 类型等,并且可能有子类型)表示纯文本,com.barebones.textwrangler 是 TextWrangler 的包 ID。

我不知道有任何 Linux 标准对于文档绑定(bind)来说如此强大 - 要执行类似 Mac 的操作,首先需要有一个标准方法来识别应用程序,无论其位置或名称如何(例如 Java Mac 上的类似包/反向 DNS 方法),然后是类型映射和绑定(bind)的注册表,后面是足够有用的桌面环境,以及安装应用程序时注册应用程序的某种方法。

您不一定需要单独的文件(例如 Mac 应用程序包中的 Info.plist)来存储此信息;即使在 Mac OS X 上,您也可以将信息嵌入到启动服务索引的二进制部分中(请注意,这不是单独的“ fork ”或扩展属性;这就像将调试信息嵌入到可执行文件中)。因此,也许可以嵌入 .desktop 文件的某些衍生文件。另一方面,您需要一种识别内容的方法。理想情况下,您甚至可以像 file(1) 命令一样进行内容嗅探来识别文档类型;经典的 Mac 操作系统通过 Translation Manager 做到了这一点(允许注册从一种格式到另一种格式的转换器以及嗅探器)。

UTI 和翻译管理器处理剪贴板并拖放内容以及磁盘上的文件;当您这样做时,统一这些格式表示非常有用。

关于linux - 系统如何在需要时调用可移植应用程序(例如文件关联)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4643642/

相关文章:

linux - 如何确定字符串是否包含awk的子字符串

ruby - 在 Mac OS X 上安装 Nokogiri gem 时出错

header - PE 最多可以有多少个部分?

c# - 如何使 c#.net 应用程序可移植

linux - 在linux上,使用NFS,open()命令是远程执行的吗?

linux - 如何在 vi 中使用 wq~ 时删除在我的其他 linux 目录中意外创建的 ~

java - 类打包时如何使用vim编译Java

macos - xamarin for mac 无法创建或打开 xamarin.form 项目

c - _aenvptr 和 _wenvptr 的重复定义

linux - Mac 上的 Docker 分离了内部和外部文件所有权;在 Linux 上不是这样