“执行”是做什么的?

4 command-line execute-command

我最近打算运行该命令pkexec,但不小心设法在exec没有选项或参数的情况下自行运行该命令。我查看了man页面的描述exec,但我仍然不知道它是什么意思:

DESCRIPTION
       The  exec() family of functions replaces the current process image with
       a new process image.  The functions described in this manual  page  are
       front-ends  for execve(2).  (See the manual page for execve(2) for fur?
       ther details about the replacement of the current process image.)
Run Code Online (Sandbox Code Playgroud)

实际上描述还在继续......但其余的描述也没有给我太大帮助......所以这真的是我的问题,该exec命令有什么作用?我是否只是通过自己执行它而没有任何选项或参数来做任何事情exec?它与pkexec命令有任何关系吗?

mur*_*uru 5

exec()函数族”……是函数。它们在源代码中使用。它们不是要由用户1执行的命令。它们通常由需要执行另一个程序的程序使用(例如,shell 本身sudopkexec、 等)。exec直接调用的程序会发现自己被exec'd 程序取代,因此典型用法通常是forkexec

一个人为的例子看起来像:

$ cat foo.c 
#include <unistd.h>
int main()
{
    const char * path = "/bin/echo";
    char * args[] = {"echo", "Hello", "World!", NULL};
    execv(path, args);
}
$ gcc -o foo foo.c
$ ./foo           
Hello World!
Run Code Online (Sandbox Code Playgroud)

您可以看到在各种程序上exec使用的实际使用实例strace,包括strace它本身:

$ strace -e execve ./foo
execve("./foo", ["./foo"], [/* 52 vars */]) = 0
execve("/bin/echo", ["echo", "Hello", "World!"], [/* 52 vars */]) = 0
Hello World!
+++ exited with 0 +++
Run Code Online (Sandbox Code Playgroud)

注意它strace自己是如何exec调用程序的,然后程序依次调用exec.


1 ...除了exec外壳内置,这是一个壳特征。

execshell 内置exec函数就像函数一样,调用exec程序名会导致 shell 被它替换。但是, 的常见用法exec通常用于修改或添加文件描述符

另一个人为的例子:

$ exec 3</dev/urandom
$ read -u 3 -n 10
$ echo "$REPLY" | base64 
oZN5Qsn3nAs+1GFUCg==
Run Code Online (Sandbox Code Playgroud)

你可能认为我们可以/dev/urandom直接读入。是的,我们可以。但是,这在以下情况下很有用:

  • 我们需要读取/写入多个文件描述符
  • 我们需要替换一个或多个标准文件描述符(例如,发送stdout到整个 shell 会话的文件)。