最近在 KDE 桌面环境下使用 WPS Office 时发现一个普遍问题:

无法通过双击打开任意文件,包括本地文件和 SMB/NAS 上的文件。

经过调试发现:

  • 本地文件:WPS 新版 Linux 命令行启动器有 bug,直接双击就打不开。

  • SMB/NAS 文件:在测试社区提供的 AUR 脚本时发现,它原有逻辑无法正确处理 KIO-FUSE 挂载路径,文件也打不开。


1️⃣ 问题来源

  • KDE 使用 KIO-FUSE 将 SMB/NAS 路径挂载到 /run/user/...

  • WPS 启动器没有正确切换工作目录

  • 导致 FUSE 路径解析失败

因此,无论是本地文件还是远程文件,双击打开都会失败。


2️⃣ 社区方案

AUR 上有人提供了包装脚本:

  • 自动去掉 file:// 前缀

  • 能解决部分本地文件打开问题

但仍有两个缺陷:

  1. 本地文件仍可能打不开(因为 WPS 命令行 bug)

  2. 对 SMB/KIO-FUSE 路径处理不完整


3️⃣ 我的改进方案

在社区脚本基础上,我做了以下增强:

  • 自动切换工作目录:保证 KIO-FUSE 挂载路径可以被 WPS 识别

  • 支持 file:// 和 URL 编码路径

  • 日志记录:方便调试

  • 多文件兼容:可以一次打开多个文件


🛠️ 脚本实现

创建 /usr/local/bin/run-wps.sh

#!/usr/bin/env bash
# 自动进入文件所在目录再启动 WPS,支持本地路径、file://、KIO-Fuse(SMB/NAS)

log_file="/tmp/kde-open-wps.log"
echo "[$(date)] Arguments:" "$@" >> "$log_file"

declare -a paths=()
declare -a fnames=()

for arg in "$@"; do
    path="${arg#file://}"
    if [[ ! -e "$path" && "$path" == *%* ]]; then
        path=$(printf '%b' "${path//%/\\x}")
    fi
    if [[ -f "$path" ]]; then
        paths+=("$(dirname "$path")")
        fnames+=("$(basename "$path")")
    else
        echo "[$(date)] ⚠️ 文件不存在: $path" >> "$log_file"
    fi
done

if [[ ${#paths[@]} -gt 0 ]]; then
    cd "${paths[0]}" || { echo "[$(date)] ❌ 无法进入目录: ${paths[0]}" >> "$log_file"; exit 1; }
    exec wps "${fnames[@]}"
else
    echo "[$(date)] ❌ 没有找到可打开的文件" >> "$log_file"
    exit 1
fi

赋予执行权限:

sudo chmod +x /usr/local/bin/run-wps.sh

4️⃣ 修改 Desktop 启动器

.desktop 文件中的启动命令改为脚本:

Exec=/usr/local/bin/run-wps.sh %F

修改后即可生效。

这边提供方便的一行脚本:

sudo find /usr/share/applications/ -maxdepth 1 -type f -name "wps-office-*.desktop" -exec bash -c 'cp "$0" "$0.bak" && sed -i -E "s|Exec=.*|Exec=/usr/local/bin/run-wps.sh %F|g" "$0"' {} \;

5️⃣ 效果

  • 本地文件:受 WPS 命令行 bug 限制,可能仍打不开

  • SMB/NAS 文件:经过脚本处理,可正常打开

  • 日志记录:位于 /tmp/kde-open-wps.log


这样,博客就准确反映了:

  1. 原始问题是 WPS 命令行 bug

  2. 社区方案有修复但仍存在 SMB 问题

  3. 改进解决了 SMB/FUSE 兼容问题,并增加了健壮性