the*_*kal 29 command-line unity launcher gsettings dconf
两天前,我从 Windows 迁移到了 Ubuntu 16.04。我喜欢我们可以自定义 Unity 桌面的方式。我只是在玩弄桌面环境的外观和感觉。就像在 Windows 中一样,我希望启动器位于屏幕底部。在谷歌上,我发现了一个命令,它是这样的:
gsettings set com.canonical.Unity.Launcher launcher-position Bottom
Run Code Online (Sandbox Code Playgroud)
此外,还有用于完成工作的 unity-tweak-tool 和 dconf 编辑器。但这些是完成工作的 GUI 方法。
我的问题是:
这里的答案告诉了如何获取进程的标准文件描述符。但是,我没有在输出中得到任何东西。
此外,该strace -p pid -o output.txt命令会向文件中抛出大量文本。
那么,简而言之,使用 GUI 应用程序做事与从命令行做事是一样的吗?
Ser*_*nyy 35
这些基于 GUI 的应用程序是否也在后台执行相同的命令?
是和否。他们写入dconf设置的数据库,但他们可能使用不同的方式来执行此操作。用 Python 编写的程序可能会使用该gi.repository.Gio模块(我知道是因为我经常使用它),或者他们可以gsettings通过调用subprocess.Popen(['gsettings','org.some.schema','some-key','value'])将其用作外部命令,并且它基本上将作为 shell 命令运行。AC 程序将使用类似的东西,可能是一个gio.h库,或者它甚至可以使用exec()一系列函数来完成与PopenPython 中相同的功能。所以要回答你的标题问题:“基于 GUI 的应用程序是否在后台执行 shell 命令?” 他们可以,但可能没有必要,因为无论应用程序是用什么语言编写的,都有一个库,并且使用库函数可能比生成一个新进程要快一些。
为了向您展示如何使用库/模块进行示例,请随时查看我的启动器列表指示器的源代码。在那里,我编写了一个函数来创建Gio.Settings类的实例,然后使用它来根据您想要在那里拥有的列表类型来修改 Unity 启动器。
如何窥视这些应用程序的内部工作?我的意思是,有没有办法实际查看每次单击按钮时正在执行的命令?
不可以。如果您想在按下按钮或单击窗口元素时查看以该应用程序的编程语言发出的命令,那么这是不可能的。阅读应用程序的源代码,如果可能的话。您可以使用dconf watch /来查看正在更改的设置,而不是更改方式。
从技术上讲,如果您知道如何操作调试器、读取内存地址并了解一些汇编语言,那么您就可以知道应用程序在 CPU 和内存级别上做了什么。这被称为软件逆向工程,安全专业人员经常使用它来分析恶意软件并发现合法软件中的漏洞。
这些应用程序是否在后台打开终端并执行这些命令?
不,没有连接终端。许多程序知道dconf用户的数据库所在的位置并在那里写入。还有一个称为 的进程间通信总线dbus,程序可以在其中发送信号,程序会像“嘿,这是给我的消息!”
应用程序可以运行其他应用程序吗?是的,这是通过标准fork()和execve()系统调用完成的。在 Linux 和其他 *nix 系统上创建进程的本质主要基于这两者。运行非内置命令的 Shell 机制特别使用了这一点。当您以交互方式运行时
$ ls
Run Code Online (Sandbox Code Playgroud)
shell 将通过创建一个新进程fork(),该进程将运行execve() 并启动ls。因为execve()新的分叉过程将如何ls。该pipe()系统调用是什么将帮助回读的输出ls。我强烈建议阅读我对管道和重定向之间有什么区别的回答,以了解管道机制的工作原理——它不仅仅是|操作符,而且实际上是一个系统调用。
应用程序可以运行 shell 命令吗?不可以。Shell 语法只能由 shell 本身理解。但是,您可以做的是使用命令行-c开关启动 shell并提供适当的命令。这通常用于在 GNOME 或其他桌面环境中设置的自定义快捷方式,因为自定义快捷方式对可执行文件进行操作,并且没有外壳来理解语法。因此,例如,您bash -c 'xdotool key Ctrl+Alt+T'可以间接运行xdotool命令或bash -c 'cd $HOME/Desktop; touch New_File'通过快捷方式在桌面上创建新文件。这是一个特别有趣的例子,因为您可以使用 shell 变量,因为您明确地使用了 shell。
Jac*_*ijm 21
这些设置编辑器所做的大部分工作都可以通过运行来查看
dconf watch /
Run Code Online (Sandbox Code Playgroud)
在一个终端。
同样在大多数情况下,为了实现您在上面的命令中看到的内容,这些应用程序需要编辑dconf数据库(下文进一步介绍)。这可以通过使用dconf的 cli 选项(不是首选)直接完成,也可以通过运行相应的命令(如您提到的命令)来完成。gsettings
要运行这些命令,不需要终端窗口,如示例中所示。
gsettings是 cli 前端dconf,它依次dconf以二进制格式编辑存储大多数设置的数据库。另请参阅这个不错的答案。
的dconf数据库,顺便说一下,也可以从由GUI编辑dconf编辑器,它是在存储库中:
为了向您展示幕后发生的事情,在一个工作示例下方,通过单个(切换)按钮从 GUI 切换您的启动器位置:
dconf watch /
Run Code Online (Sandbox Code Playgroud)
将代码粘贴到空白处 file.py
通过命令运行它:
python3 /path/to/file.py
Run Code Online (Sandbox Code Playgroud)
...玩得开心。
即使是一个简单的启动器也可以从 GUI 完成这项工作:
[Desktop Entry]
Name=Set launcherposition
Exec=zenity --info --text="Right- click to set launcher position"
Type=Application
StartupNotify=False
Icon=preferences-system
Actions=Launcher to bottom;Launcher on the left;
[Desktop Action Launcher to bottom]
Name=Launcher to bottom
# right click option to set launcher to bottom
Exec=gsettings set com.canonical.Unity.Launcher launcher-position Bottom
[Desktop Action Launcher on the left]
Name=Launcher on the left
# right click option to set launcher to left
Exec=gsettings set com.canonical.Unity.Launcher launcher-position Left
Run Code Online (Sandbox Code Playgroud)
setlauncher.desktop对于永久使用,请将其存储在~/.local/share/applications(本地使用)或~/usr/share/applications所有用户中。