为什么“pgrep -a”的输出会根据文件的打开方式而不同?

为什么“pgrep -a”的输出会根据文件的打开方式而不同?

操作系统:Ubuntu 18.04 或 Kubuntu 18.04

如果我通过文件管理器打开一个文件,右键单击并选择 gedit 打开它,然后运行,pgrep -a我得到

dkb@dkb-ubu1804:~$ pgrep -a gedit
2044 gedit /home/dkb/.bash_aliases

另一方面,如果我首先打开 gedit 并使用文件选择器对话框打开同一个文件,则pgrep -a显示的都是

dkb@dkb-ubu1804:~$ pgrep -a gedit
2081 gedit
dkb@dkb-ubu1804:~$ 

未显示文件的名称和路径。

这是为什么?

答案1

这是因为pgrep -a显示程序的名称及其命令行参数,当您右键单击/home/dkb/.bash_aliases并使用 打开它时gedit,这实际上是以命令行参数运行gedit/home/dkb/.bash_aliases。也就是说,就像您运行了命令一样gedit /home/dkb/.bash_aliases。将文件名作为命令行参数传递不仅适用于您通常在终端中运行的程序。它对于如何在桌面环境中打开文件也至关重要。

当您运行程序打开文件时,无论是通过右键单击文件并选择程序,双击文件(如果文件属于配置为使用该特定程序打开的 MIME 类型),还是将文件拖到程序的启动器上,这都会导致程序运行,并将文件名作为命令行参数传递给它。这与在终端窗口中运行的方式相同,也是可行的。gedit filename

相反,如果打开 gedit 时没有要编辑的初始文件,则不会向其传递任何命令行参数。这与只运行 的方式相同gedit当你然后在程序中打开文件,这不会改变传递给它的命令行参数。

当程序(如 check)时,程序可能会尝试更改传递给它的命令行参数pgrep。但这种做法很少见,通常只是作为删除密码等敏感信息的权宜之计。(更好的方法是不要在命令行参数中传递密码。)

命令行参数并不代表程序的状态。相反,它们指定程序如何运行,或者换句话说,最初指示程序执行哪些操作。(它们不是程序启动时接收的唯一信息 - 例如,程序还有环境变量、当前工作目录和 umask。)命令行和图形编辑器都接受文件名作为命令行参数。


为了更全面地了解情况,我应该说具体方式.desktop传递给在桌面环境中运行的图形程序的命令行参数因程序而异。它在用于运行程序的启动器(即文件)中指定。

为了工作,.desktop文件必须指定Exec 键1给出命令,并且(对于支持启动以打开文件或其他资源的命令)给出参数的占位符。可以使用多个占位符,但%U很常见。它可以替换为零个、一个或多个 URL 或文件名。行Exec如下gedit.desktop

Exec=gedit %U

1该链接指向 GNOME 文档,但是这个也适用适用于 KDE 和其他桌面环境。freedesktop.org 规范

相关内容