银河麒麟V10sp1中实现双击shell脚本的正常运行

几种看上去都可行的实现方式,又无意间加宽了服务商与用户之间的间隔,朝着有利于服务商发展的方向,无可非议;然而,以用户需求为核心,仍然是一个基本原则(黑客与画家,阮一峰译)。

背景与问题
按照AppImage的包组成模式,它总是有一个AppRun文件,作为启动应用的脚本文件。类似的,在中标/银河麒麟等操作系统上开发的应用,为了保持应用依赖库、配置环境变量等信息的专有和最小范围,在生成应用的可执行文件(比如app-tests)后,我们通常也会为它编写一个对应的启动脚本(比如run.sh),然而,在中标麒麟V5上编写的run.sh,在文件管理器(caja)中,双击可以运行(指最终成功运行app-tests);而在最新的银河麒麟V10sp1上,同样的run.sh文件,在文件管理器(peony)中,双击却无法运行。

中标麒麟V5中的文件结构示例:

/home/user/app-tests
    app-tests
    run.sh

中标麒麟V5中的run.sh内容示例:

#!/bin/sh

./app-tests

 

分析
中标麒麟V5上,在caja文件管理器里,双击run.sh后,对脚本运行的目录,是指的当前目录。
在银河麒麟V10上,其使用了自研的peony文件管理器,双击run.sh后,对脚本运行的目录,像是一个不可预料的状态(也有可能其有一个内部的约定,但至少是有两种情形:直接运行文件管理后,双击run.sh,脚本里的$(pwd)会输出“/home/user”结果;而在桌面(/home/user/桌面)由控制台里/usr/bin/peony启动文件管理器后,双击run.sh,脚本里的$(pwd)会输出“/home/user/桌面”结果)。
而我们不想再继续深究peony当前的实现情况,所以采用绝对路径来运行应用,是个方案。

解决
无论是中标麒麟V5、还是银河麒麟V10,均使用以下同一套脚本(run.sh),来保障运行的一致和正确性:

#!/bin/sh

#获取脚本的实际路径
scriptRunFullPath="$(readlink -f "${0}")"

#认为脚本实际路径,与可执行程序的路径,是同一个目录
scriptDir="$(dirname "${scriptRunFullPath}")"

#根据实际设置
appName="app-tests"
appDir="${scriptDir}"

exec "${appDir}/${appName}"

其他
这明显是一个小问题。然而,从界定上,它是一个编程问题,还是一个产品功能一致性问题,还是双方都有问题,难于划分。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值