桌面快捷方式.desktop运行的相对路径问题

sh/bash/dash/ksh/zsh等Shell脚本
txmsuper
帖子: 11
注册时间: 2009-03-06 19:27

桌面快捷方式.desktop运行的相对路径问题

#1

帖子 txmsuper » 2023-01-12 8:32

先贴脚本:
test.sh:

代码: 全选

#!/bin/bash
cd ./..
fpath=`pwd`
echo $fpath
sleep 10000000
test.desktop:

代码: 全选

[Desktop Entry]
Encoding=UTF-8
Name=test
Exec=sh /home/txm/Desktop/test.sh
Info="test"
Terminal=true
Type=Application
StartupNotify=true
请教一下各位大佬,为何用终端在桌面运行test.sh脚本,获得的相对路径是/home/[userid],但是运行桌面快捷方式,获取的相对路径却成了/home?
testsh.png
testdesktop.png
Ubuntuinfo.png
上次由 txmsuper 在 2023-01-12 8:55,总共编辑 1 次。
txmsuper
帖子: 11
注册时间: 2009-03-06 19:27

补充一下造成的问题

#2

帖子 txmsuper » 2023-01-12 8:48

这个造成了什么问题呢?是因为我们有个项目,需要在运行时创建 “./../logs/” 文件夹,用来保存日志文件,如果直接执行启动脚本是没有问题的,因为启动脚本所在文件夹层次比较深,但是为了方便(增强用户体验),需要创建桌面快捷方式,这时如果用桌面快捷方式执行的话,相对路径“./..”就变成了“/home”,普通用户是没有“/home”文件夹写权限的,就会报权限问题,造成项目无法启动。
头像
jiandan23
帖子: 86
注册时间: 2010-12-17 22:31
系统: Mint 19.2

Re: 桌面快捷方式.desktop运行的相对路径问题

#3

帖子 jiandan23 » 2023-01-12 10:06

你直接在终端下运行时,是在./Desktop目录里运行的,所以"./.."就回到了/home/[userid]了
头像
lilydjwg
论坛版主
帖子: 4249
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 桌面快捷方式.desktop运行的相对路径问题

#4

帖子 lilydjwg » 2023-01-12 10:42

Linux 上获取程序自己的路径应该还是比较容易的,比如 shell 脚本可以用 dirname $0。
不要用相对于工作目录的路径去找你自己的文件,因为经常会找不到的。
txmsuper
帖子: 11
注册时间: 2009-03-06 19:27

Re: 桌面快捷方式.desktop运行的相对路径问题

#5

帖子 txmsuper » 2023-01-12 13:12

jiandan23 写了: 2023-01-12 10:06 你直接在终端下运行时,是在./Desktop目录里运行的,所以"./.."就回到了/home/[userid]了
是的,终端运行是没有问题的,但是为什么用桌面快捷方式运行,他就到了/home下面了呢?
txmsuper
帖子: 11
注册时间: 2009-03-06 19:27

Re: 桌面快捷方式.desktop运行的相对路径问题

#6

帖子 txmsuper » 2023-01-12 13:18

lilydjwg 写了: 2023-01-12 10:42 Linux 上获取程序自己的路径应该还是比较容易的,比如 shell 脚本可以用 dirname $0。
不要用相对于工作目录的路径去找你自己的文件,因为经常会找不到的。
是的老师,现在问题是项目我们是没有办法修改的,但是项目现在的问题就是在桌面运行快捷方式会有路径问题,这个问题的产生原因我也不太理解,为什么桌面运行快捷方式他的相对路径会变到/home,按理说应该也是/home/[userid]才对啊 :Cry
txmsuper
帖子: 11
注册时间: 2009-03-06 19:27

Re: 桌面快捷方式.desktop运行的相对路径问题

#7

帖子 txmsuper » 2023-01-12 13:42

又有新发现,在文件管理器里面右键运行desktop文件,有报错,但是相对路径是对的
也就是说,只有在桌面双击的时候,他的相对路径是有变化的
testerror.png
头像
lilydjwg
论坛版主
帖子: 4249
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 桌面快捷方式.desktop运行的相对路径问题

#8

帖子 lilydjwg » 2023-01-12 14:25

改不了的话,你就只好写个 wrapper 脚本包装一下了。先 cd 到预期的目录,再跑。
头像
jiandan23
帖子: 86
注册时间: 2010-12-17 22:31
系统: Mint 19.2

Re: 桌面快捷方式.desktop运行的相对路径问题

#9

帖子 jiandan23 » 2023-01-12 15:14

txmsuper 写了: 2023-01-12 13:12
jiandan23 写了: 2023-01-12 10:06 你直接在终端下运行时,是在./Desktop目录里运行的,所以"./.."就回到了/home/[userid]了
是的,终端运行是没有问题的,但是为什么用桌面快捷方式运行,他就到了/home下面了呢?
我刚测了下,桌面快捷方式运行,terminal的初始目录是:/home/[userid],在调用你的脚本后(cd ./..),就会变成/home

test.desktop文件不是文本文件吗,为啥不能修改?
txmsuper
帖子: 11
注册时间: 2009-03-06 19:27

Re: 桌面快捷方式.desktop运行的相对路径问题

#10

帖子 txmsuper » 2023-01-13 8:12

lilydjwg 写了: 2023-01-12 14:25 改不了的话,你就只好写个 wrapper 脚本包装一下了。先 cd 到预期的目录,再跑。
感谢老师提供的思路,我再研究下
txmsuper
帖子: 11
注册时间: 2009-03-06 19:27

Re: 桌面快捷方式.desktop运行的相对路径问题

#11

帖子 txmsuper » 2023-01-13 8:16

jiandan23 写了: 2023-01-12 15:14
txmsuper 写了: 2023-01-12 13:12
jiandan23 写了: 2023-01-12 10:06 你直接在终端下运行时,是在./Desktop目录里运行的,所以"./.."就回到了/home/[userid]了
是的,终端运行是没有问题的,但是为什么用桌面快捷方式运行,他就到了/home下面了呢?
我刚测了下,桌面快捷方式运行,terminal的初始目录是:/home/[userid],在调用你的脚本后(cd ./..),就会变成/home

test.desktop文件不是文本文件吗,为啥不能修改?
感谢老师的回复,我测试的结果是:
终端运行.desktop的时候的根目录是/home/[userid]/Desktop,但是双击运行的根目录是/home/[userid],这里为什么终端运行和双击运行的结果不一致呢,双击运行,Ubuntu做了什么特殊的处理吗?
头像
astolia
论坛版主
帖子: 6452
注册时间: 2008-09-18 13:11

Re: 桌面快捷方式.desktop运行的相对路径问题

#12

帖子 astolia » 2023-01-13 16:21

txmsuper 写了: 2023-01-13 8:16 感谢老师的回复,我测试的结果是:
终端运行.desktop的时候的根目录是/home/[userid]/Desktop,但是双击运行的根目录是/home/[userid],这里为什么终端运行和双击运行的结果不一致呢,双击运行,Ubuntu做了什么特殊的处理吗?
我猜你运行终端的方式是在桌面右键选在终端中打开?

这涉及到子进程对父进程运行环境的继承问题。默认情况下,子进程会继承父进程的当前目录。
你双击运行.desktop文件,产生的bash进程和你运行终端产生的gnome-terminal进程,两者的当前目录都会是父进程gnome-shell的当前目录,也就是你的家目录。
但是,你在桌面上右键选在终端中打开时,负责实现这一功能的Desktop Icons NG扩展,是这么处理的:
https://gitlab.com/rastersoft/desktop-i ... r.js#L1135

代码: 全选

    _onOpenTerminalClicked() {
        let desktopPath = this._desktopDir.get_path();
        DesktopIconsUtil.launchTerminal(desktopPath, null);
    }
https://gitlab.com/rastersoft/desktop-i ... il.js#L101

代码: 全选

function launchTerminal(workdir, command) {
    let terminalSettings = new Gio.Settings({schema_id: Enums.TERMINAL_SCHEMA});
    let exec = terminalSettings.get_string(Enums.EXEC_KEY);
    let argv = [exec, `--working-directory=${workdir}`];
    if (command) {
        argv.push('-e');
        argv.push(command);
    }
    trySpawn(workdir, argv, null);
}
它给gnome-terminal传递了参数--working-directory,参数值是你桌面目录的路径,所以gnome-terminal启动后,解析参数发现有--working-directory,就将当前目录从家目录换成了参数值指定的桌面目录
txmsuper
帖子: 11
注册时间: 2009-03-06 19:27

Re: 桌面快捷方式.desktop运行的相对路径问题

#13

帖子 txmsuper » 2023-01-16 9:31

astolia 写了: 2023-01-13 16:21
txmsuper 写了: 2023-01-13 8:16 感谢老师的回复,我测试的结果是:
终端运行.desktop的时候的根目录是/home/[userid]/Desktop,但是双击运行的根目录是/home/[userid],这里为什么终端运行和双击运行的结果不一致呢,双击运行,Ubuntu做了什么特殊的处理吗?
我猜你运行终端的方式是在桌面右键选在终端中打开?

这涉及到子进程对父进程运行环境的继承问题。默认情况下,子进程会继承父进程的当前目录。
你双击运行.desktop文件,产生的bash进程和你运行终端产生的gnome-terminal进程,两者的当前目录都会是父进程gnome-shell的当前目录,也就是你的家目录。
但是,你在桌面上右键选在终端中打开时,负责实现这一功能的Desktop Icons NG扩展,是这么处理的:
https://gitlab.com/rastersoft/desktop-i ... r.js#L1135

代码: 全选

    _onOpenTerminalClicked() {
        let desktopPath = this._desktopDir.get_path();
        DesktopIconsUtil.launchTerminal(desktopPath, null);
    }
https://gitlab.com/rastersoft/desktop-i ... il.js#L101

代码: 全选

function launchTerminal(workdir, command) {
    let terminalSettings = new Gio.Settings({schema_id: Enums.TERMINAL_SCHEMA});
    let exec = terminalSettings.get_string(Enums.EXEC_KEY);
    let argv = [exec, `--working-directory=${workdir}`];
    if (command) {
        argv.push('-e');
        argv.push(command);
    }
    trySpawn(workdir, argv, null);
}
它给gnome-terminal传递了参数--working-directory,参数值是你桌面目录的路径,所以gnome-terminal启动后,解析参数发现有--working-directory,就将当前目录从家目录换成了参数值指定的桌面目录
感谢版主的回复,在桌面用终端运行我理解了,有了源码的参考更加清晰了,再次感谢~
我这里有疑问的是双击运行.desktop文件时,ubuntu的处理过程,因为从结果上看,双击.desktop这个动作执行的根目录好像是在用户根目录“/home/[userid]”,而非“/home/[userid]/Desktop”。我又做了个测试,将test.desktop文件复制到/usr/share/applications下,从启动器执行,得到的上级目录结果依然是/home。这看似是跟.desktop文件的执行动作有关,是否gnome执行所有的.desktop文件,都会将工作目录置为~?
另:我在终端执行.desktop文件的操作应该是不对的,终端执行的话,会将.desktop文件认定成为普通的脚本逐行执行,所以我之前有部分实验是错误的。
再次感谢版主回复,受宠若惊,如果可以的话,版主能否指点一下.desktop文件执行方面的知识?.desktop文件能否通过编写参数改变执行的根目录? :Adore
头像
astolia
论坛版主
帖子: 6452
注册时间: 2008-09-18 13:11

Re: 桌面快捷方式.desktop运行的相对路径问题

#14

帖子 astolia » 2023-01-17 12:47

txmsuper 写了: 2023-01-16 9:31 我这里有疑问的是双击运行.desktop文件时,ubuntu的处理过程,因为从结果上看,双击.desktop这个动作执行的根目录好像是在用户根目录“/home/[userid]”,而非“/home/[userid]/Desktop”。我又做了个测试,将test.desktop文件复制到/usr/share/applications下,从启动器执行,得到的上级目录结果依然是/home。这看似是跟.desktop文件的执行动作有关,是否gnome执行所有的.desktop文件,都会将工作目录置为~?
我上面第二段写的你都没看是不是?.desktop文件只是一个纯文本配置文件,并不是一个linux原生支持的可执行文件。你看到的双击它就有一个程序启动,并不是它自身去运行的,而是其他的某个程序去解析了它的内容,再去运行的。你首先需要弄清楚的就是这某个程序到底是哪个。这个很容易查到,就写在进程的parent pid即ppid里。gnome的系统监视器没把ppid列出来,但可以在设置里选择显示依赖关系,就可以以树状结构显示进程的父子关系了。再通过/proc/进程ID/cwd,就能知道到底是哪一级的进程更改了工作目录
txmsuper 写了: 2023-01-16 9:31 再次感谢版主回复,受宠若惊,如果可以的话,版主能否指点一下.desktop文件执行方面的知识?.desktop文件能否通过编写参数改变执行的根目录?
有规范在 https://specifications.freedesktop.org/ ... ec/latest/
规范中有明确规定可以通过Path来指明工作目录 https://specifications.freedesktop.org/ ... 01s06.html
不过如果你设的是个相对路径,负责解析执行它的程序一般仍然会是相对于自己的工作目录来设定,而不是.desktop文件所在的目录。
一般的做法就是4楼所说的,在.desktop文件里执行一个中间脚本而非最终程序,在中间脚本中通过dirname $0来获取脚本所在的目录,再以此为基准切换到最终程序的目录来执行。这样就不用去管运行环境的工作目录的事了
txmsuper
帖子: 11
注册时间: 2009-03-06 19:27

Re: 桌面快捷方式.desktop运行的相对路径问题

#15

帖子 txmsuper » 2023-01-17 15:09

astolia 写了: 2023-01-17 12:47
txmsuper 写了: 2023-01-16 9:31 我这里有疑问的是双击运行.desktop文件时,ubuntu的处理过程,因为从结果上看,双击.desktop这个动作执行的根目录好像是在用户根目录“/home/[userid]”,而非“/home/[userid]/Desktop”。我又做了个测试,将test.desktop文件复制到/usr/share/applications下,从启动器执行,得到的上级目录结果依然是/home。这看似是跟.desktop文件的执行动作有关,是否gnome执行所有的.desktop文件,都会将工作目录置为~?
我上面第二段写的你都没看是不是?.desktop文件只是一个纯文本配置文件,并不是一个linux原生支持的可执行文件。你看到的双击它就有一个程序启动,并不是它自身去运行的,而是其他的某个程序去解析了它的内容,再去运行的。你首先需要弄清楚的就是这某个程序到底是哪个。这个很容易查到,就写在进程的parent pid即ppid里。gnome的系统监视器没把ppid列出来,但可以在设置里选择显示依赖关系,就可以以树状结构显示进程的父子关系了。再通过/proc/进程ID/cwd,就能知道到底是哪一级的进程更改了工作目录
txmsuper 写了: 2023-01-16 9:31 再次感谢版主回复,受宠若惊,如果可以的话,版主能否指点一下.desktop文件执行方面的知识?.desktop文件能否通过编写参数改变执行的根目录?
有规范在 https://specifications.freedesktop.org/ ... ec/latest/
规范中有明确规定可以通过Path来指明工作目录 https://specifications.freedesktop.org/ ... 01s06.html
不过如果你设的是个相对路径,负责解析执行它的程序一般仍然会是相对于自己的工作目录来设定,而不是.desktop文件所在的目录。
一般的做法就是4楼所说的,在.desktop文件里执行一个中间脚本而非最终程序,在中间脚本中通过dirname $0来获取脚本所在的目录,再以此为基准切换到最终程序的目录来执行。这样就不用去管运行环境的工作目录的事了
感谢老师详尽的回答,受教了,思路您指的非常明晰,我去研究一下 :Haha
回复