V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
ZoomQuiet
V2EX  ›  Linux

[FAQ]有关点击 Ubuntu 桌面图标运行 shell 脚本

  •  
  •   ZoomQuiet ·
    ZoomQuiet · 2019-05-22 10:10:26 +08:00 · 4588 次点击
    这是一个创建于 2022 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景

    • 用 PyQt4 写了个软件,主要功能已经完成
    • 依赖 conda+OpenCV2 等等重型模块
    • 好在已经完成可调用 .sh
    • 在 GNOME Terminal 中直接使用
      • $ /path/2/myGUI.sh 形式
      • 可以执行, 并弹出 PyQt4 软件窗口

    目标

    • 将 python 运行的 GUI 软件变成标准桌面图标
    • 用户双击图标, 即可弹出 PyQt4 构建的软件窗口
    • 环境:
      • Ubuntu 18.04.2 LTS
      • conda 4.6.12
      • Python 2.7.15
      • opencv 2.4.11
      • qt 4.8.7
      • sip 4.18
      • ...

    尝试

    根据: How to create desktop shortcut launcher on Ubuntu 18.04 Bionic Beaver Linux - LinuxConfig.org

    手工或是使用 gnome-desktop-item-edit 创建 .desktop 声明, 都可以在桌面形成标准软件图标;

    但是, 双击没任何反应, 并没形成 .sh 中记录的运行时日志

    两种方式构建的 .desktop 主要差异只是首行是否有

    #!/usr/bin/env xdg-open
    

    根据: desktop - How to launch shell script with double click in CentOS 7 - Unix & Linux Stack Exchange

    这里建议可以直接链接脚本本身

    $ cd $HOME/Desktop
    $ ln -s $HOME/bin/myscript.sh MyScript
    

    只是没图标, 也可以接受, 但是,按照文章完成了部署, 到桌面点击依然没任何反应

    其中 .desktop 声明文件中尝试过:

    Exec=/path/2/myGUI.sh
    
    Exec=gnome-terminal -e "bash -c '/path/2/myGUI.sh;$SHELL'"
    
    Exec=gnome-terminal -e "bash -c '/path/2/myGUI.sh'"
    
    Exec=gnome-terminal -e "bash /path/2/myGUI.sh"
    
    Exec=bash /path/2/myGUI.sh
    
    Exec=sh /path/2/myGUI.sh
    

    都不能正常运行, 弹出 PyQt4 构建的软件界面

    分析

    参考: How to Create a .Desktop File For Your Application in Linux - Make Tech Easier

    • 发现先决条件是在资源管理器中 right click 可以 run
      • 才能最终用标准 .desktop 图标来调用;
    • 测试发现当前自己写的 .sh 用这种形式无法运行;
      • 这可能是桌面图标无反应的原因;

    那么当前问题就变成:

    • 终端中人工输入路径可以运行的 .sh 文件
      • 已经用 chmod a+x 指定可运行属性
    • 为什么, 在 Files (GNOME 资源管理器)中, 右键菜单无法正常运行?
      • 以及这种情况, 如何调试 .sh ?

    refer

    launcher - How to execute a script just by double clicking like .EXE files in Windows? - Ask Ubuntu https://askubuntu.com/questions/138908/how-to-execute-a-script-just-by-double-clicking-like-exe-files-in-windows

    发现这种套在终端中运行的形式 Exec=gnome-terminal -e "bash -c './script.sh;$SHELL'"

    解决原先脚本运行时参数问题;

    3 条回复    2019-05-22 17:53:55 +08:00
    liangzi
        1
    liangzi  
       2019-05-22 13:42:34 +08:00
    [Desktop Entry]
    Name=程序名称
    Type=Application
    Terminal=false
    Exec=/path/file 指向你脚本路径
    Icon=/path/icon_file 指向你程序启动后的图标

    ----
    这种  Exec=sh /path/2/myGUI.sh  没试过 不确定
    ZoomQuiet
        2
    ZoomQuiet  
    OP
       2019-05-22 15:32:17 +08:00
    @liangzi 是也乎,( ̄▽ ̄)

    多谢指点...

    已经解决, 果然不是 .desktop 的声明问题,

    而是那个 .sh 的运行问题;

    - 因为, 通过 .desktop 运行时, 其实和 crontab 运行的 shell 一样
    + 是个特殊的无环境变量 shell 环境
    + 这就解释了, 为什么在终端中运行良好,
    + 但是, 无论从 .desktop/桌面脚本链接 /File 中点击 run 都不正常
    - 通过追加日志输出
    - 最后捕捉到了运行失败的代码行
    - 才发现:
    + 为了兼容不同主机 /环境下的运行
    + 依赖了一个 ENV 路径数据
    + 但是, .desktop 调用时, 是没这个 ENV 路径的
    + 导致本身 Python 程序无法运行
    + 表现出来就是图标调用失败
    - 解决方法也很囧:
    + 在供给 .desktop 调用的 .sh 中
    + 使用 `export 依赖路径_ROOT="/path/2/约定的程序安装目录"`
    + 自己临时给自己配置一个

    以上...

    可以说, 这是 Linux 对桌面环境视之为一个沙箱的安全控制策略了.
    codehz
        3
    codehz  
       2019-05-22 17:53:55 +08:00
    其实你可以手工 xdg-open 然后看输出的。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1401 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 17:42 · PVG 01:42 · LAX 09:42 · JFK 12:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.