就在两天前,我已经从Windows迁移到Ubuntu 16.04。我喜欢我们自定义Unity桌面的方式。我只是在玩弄桌面环境的外观。就像在Windows中一样,我希望启动器位于屏幕底部。在Googling上,我发现了一条如下所示的命令:
gsettings set com.canonical.Unity.Launcher launcher-position Bottom
另外,还有unity-tweak-tool和dconf编辑器可以完成工作。但是,这些是完成工作的GUI方法。
我的问题是:
这里的答案告诉您如何获取进程的标准文件描述符。但是,我在输出中什么都没有。
而且,该strace -p pid -o output.txt
命令向文件中抛出大量文本。
简而言之,使用GUI应用程序进行的操作是否与通过命令行进行操作相同?
这些基于GUI的应用程序还会在后台执行相同的命令吗?
是的,没有。他们将dconf
设置写入数据库,但是他们可能会使用不同的方式来进行设置。用Python编写的程序很可能会使用该gi.repository.Gio
模块(我知道,因为我经常使用它),或者它们可以gsettings
通过调用用作外部命令subprocess.Popen(['gsettings','org.some.schema','some-key','value'])
,并且基本上可以作为shell命令运行。AC程序将使用类似的东西,可能是一个gio.h
库,或者甚至可以使用exec()
一系列函数来实现与Popen
python相同的功能。因此,回答您的标题问题:“基于GUI的应用程序是否在后台执行shell命令?” 它们可以,但是没有必要,因为有一个应用程序编写语言可以使用的库,而且使用库函数可能比生成新进程要快一些。
为了给您提供有关如何使用库/模块的示例,请随时查看启动器列表指示器的源代码。我在那里编写了一个函数,用于创建Gio.Settings
类的实例,然后根据要在其中使用的列表的类型,使用它来修改Unity启动器。
如何窥视这些应用程序的内部工作?我的意思是,有没有一种方法可以真正查看每次单击按钮时正在执行的命令?
否。如果您想在按按钮或单击窗口元素时查看使用该应用程序的编程语言发出的命令,则不可能。如果有可能,请阅读应用程序的源代码。您可以dconf watch /
用来查看正在更改的设置,但不能查看更改的方式。
从技术上讲,如果您知道如何操作调试器,读取内存地址并了解某种汇编语言,则可以知道应用程序在CPU和内存级别上的作用。这称为软件逆向工程,安全专家经常使用它来分析恶意软件并发现合法软件中的漏洞。
这些应用程序是否在后台打开终端并执行这些命令?
不,没有连接终端。许多程序都知道dconf
用户数据库所在的位置并在其中写入。还有一个称为的进程间通信总线dbus
,程序可以在该总线上发送信号,并且程序将类似于“嘿,这是给我的消息!”
应用程序可以运行其他应用程序吗?是的,这是通过标准调用fork()
和execve()
系统调用完成的。在Linux和其他* nix系统上创建进程的本质很大程度上基于这两个。运行非内置命令的Shell机制使用了很多。交互式运行时
$ ls
外壳将通过创建一个新的进程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'
通过快捷方式在桌面上创建新文件。这是一个非常有趣的示例,因为可以显式地使用外壳程序,因此可以使用外壳程序变量。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句