我有一个运行来创建电子邮件的 bash 脚本。我现在不想修改它,因为它在我当前的项目中非常关键。一个命令在操作机器和我的机器上运行不一样:
xdg-mime query filetype <file>
us-ascii
它在一个简单的编码文本文件(带有custome文件扩展名)上运行。问题是,在脚本运行的操作机器上,它返回plain/text
(预期的行为)。 xdg-mime 的调试模式显示它实际上是file -i
在操作机器上运行命令。但在我的机器上,它返回application/octet-stream
并运行gnomevfs-info
命令。它似乎与桌面环境有关(两台机器都在 gnome 上运行)。
有没有办法强制xdg-mime
跑file -i
?或者让gnomevfs-info
返回正确的 mime 类型?我尝试取消设置GNOME_DESKTOP_SESSION_ID
,但效果如下xdg-mime
:
detectDE()
{
if [ x"$KDE_FULL_SESSION" = x"true" ]; then DE=kde;
elif [ x"$GNOME_DESKTOP_SESSION_ID" != x"" ]; then DE=gnome;
elif `dbus-send --print-reply --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.GetNameOwner string:org.gnome.SessionManager > /dev/null 2>&1` ; then DE=gnome;
elif xprop -root _DT_SAVE_MODE 2> /dev/null | grep ' = \"xfce4\"$' >/dev/null 2>&1; then DE=xfce;
fi
}
第三个elif
是导致xdg-mime
使用gnomevfs-info
over 的一个file -i
,因为该命令返回 0 并且 DE 设置为 gnome。我尝试查看手册页,但该命令dbus-send --print-reply --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.GetNameOwner string:org.gnome.SessionManager > /dev/null 2>&1
对我来说是胡言乱语。
答案1
如果您提前知道自定义文本文件扩展名,则可以简单地为它们注册一个新的 MIME 条目,作为解决方法。
例如,如果您的文件的扩展名为“.list”:
准备描述符文件:飞艇列表.xml
<?xml version="1.0"?>
<mime-info xmlns='http://www.freedesktop.org/standards/shared-mime-info'>
<mime-type type="text/plain">
<comment>List file type</comment>
<glob pattern="*.list"/>
</mime-type>
</mime-info>
注册一个新的 MIME 条目:
%xdg-mime install zeppelin-list.xml
询问:
%xdg-mime query filetype my.list
text/plain
答案2
xdg-mime
是桌面环境的核心组件,您不应尝试更改其行为。我理解您担心破坏关键任务脚本,但如果它在操作机器和测试机器上产生不同的结果,那就是已经坏了,必须修理。基本上,
file -b --mime-type <file>
是一个简单的替代品
xdg-mime query filetype <file>
并且更改它应该是轻松的,特别是如果您首选的行为是file -i
.
这些xdg-*
命令在设计上取决于您正在运行的桌面环境(请记住,前缀代表X D桌面G组)并且原则上,它们根本不应该在不用于用户交互的脚本中使用。
如果您希望在所有系统上具有完全相同的行为,请使用类似 的命令file
,这些命令始终以相同的方式运行(好吧,它们可能版本差异较小,但这是不可避免的)。
如果您希望每个系统都有“最明智”的行为,请使用这些包装器命令xdg-mime
,并准备好适应每个系统上“最明智”的想法。
错误的做法是尝试改变每个环境,以使依赖于环境的程序表现相同。