![将所有启动器 (*.desktop) 设置为可执行的简单 Bash 脚本不起作用](https://linux22.com/image/909560/%E5%B0%86%E6%89%80%E6%9C%89%E5%90%AF%E5%8A%A8%E5%99%A8%20(*.desktop)%20%E8%AE%BE%E7%BD%AE%E4%B8%BA%E5%8F%AF%E6%89%A7%E8%A1%8C%E7%9A%84%E7%AE%80%E5%8D%95%20Bash%20%E8%84%9A%E6%9C%AC%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8.png)
希望比我聪明的人可以帮助我......
每次我对操作系统进行重大更改(例如升级到 18.04(Bionic Beaver)或更改窗口管理器(Gnome))时,桌面上的启动器(.desktop)文件都会失去可执行权限。进行这些更改后,双击启动器文件(例如 audacity.desktop)提供的每个图标,会弹出一条消息,要求我“信任并启动”该应用程序。这对我来说非常不方便,因为我根据可能正在开发的内容(网站设计与印刷桌面出版或多媒体编辑和 DVD 创建等)在桌面上的各个文件夹中组织了大量启动器。我不应该从启动器打开每个应用程序,单击“信任并启动”,然后关闭它,以确保它在我真正需要时可以正常工作。因此,我编写了一个简单的 BASh 脚本来处理给定文件夹中的所有启动器,从 ~Desktop/ 文件夹本身开始,但出于某种奇怪的原因,它就是不起作用!这是我的无法正常工作的生产脚本:
#!/bin/sh
for myDesktop in $HOME/Desktop/*.desktop
do /usr/bin/gio set \"$myDesktop\" \"metadata::trusted\" "yes"
done
我最终得到了这些错误而不是期望的结果:
gio: Too many arguments
Usage:
gio set [OPTION…] LOCATION ATTRIBUTE VALUE...
Set a file attribute of LOCATION.
Options:
-t, --type=TYPE Type of the attribute
-n, --nofollow-symlinks Don’t follow symbolic links
[2]+ Done for myDesktop in $HOME/Desktop/*.desktop;
do
/usr/bin/gio set \"$myDesktop\" \"metadata::trusted\" "yes";
done
下面是我的模拟脚本,它通过回显产生所需的输出,也就是说,每个启动器所需的命令只是打印出来,而不是执行:
#!/bin/sh
for myDesktop in $HOME/Desktop/*.desktop
do echo /usr/bin/gio set \"$myDesktop\" \"metadata::trusted\" "yes"
done
我的模拟创建的命令会根据需要正确打印每个启动器的所有命令,例如:
/usr/bin/gio set "/home/bruce/Desktop/audacity.desktop" "metadata::trusted" yes
复制上述命令并单独运行它可以达到预期的效果,在这种情况下,audacity 将作为“信任并启动”启动,但必须在每个启动器上的 cli 上运行每个命令,这比双击每个启动器图标然后单击“信任并启动”还要不方便...回到原点! 注意:必须用引号引起文件名,因为某些应用程序(例如 gedit)具有带有空格的启动器,如“Text Editor.desktop”。
我不明白为什么我可以让脚本在每个 *.desktop 启动器上打印“信任并启动”的正确命令,但 BASh 却拒绝实际运行它们(在删除 echo 命令后)。我以前从未见过这样的事情,模拟可以工作,但实际脚本始终失败。
帮助!
提前致谢
答案1
正如@nosklo 指出的那样,删除反斜杠就可以了。
用于定义可能包含空格的变量的双引号前不需要反斜杠。
此外,echo
命令做需要反斜杠,但是你的 bash 脚本才不是。
#!/bin/bash
for myDesktop in $HOME/Desktop/*.desktop
do /usr/bin/gio set "$myDesktop" "metadata::trusted" "yes"
done
要验证您的更改,请运行以下命令:
gio info ~/Desktop/*.desktop | grep -P 'metadata|uri'
包含空格的文件将包含“%20”而不是上一个命令输出中的空格。
最后,注销然后重新登录以使更改生效。
另外,如果您只想将这些文件设置为可执行文件,那么您可以使用chmod
如下命令:
#!/bin/bash
for i in ~/Desktop/*.desktop
do chmod +x "$i"
done
然而,这并不会使文件变得“可信”。