exec не работает с set(команда sh)

Объясните, пожалуйста, почему в первом случае программа работает правильно, а во втором случае нет

#include <unistd.h>
#include <fcntl.h>

using namespace std;

int main()
{
    execlp("sh", "sh", "-c", "set", NULL);

    return 0;
}


#include <iostream>
#include <unistd.h>
#include <fcntl.h>
#include <vector>

using namespace std;

int main()
{
    vector<char*> ARG(2);
    ARG[0] = "set";
    ARG[1] = nullptr;
    execvp(ARG[0], &ARG[0]);
    return 0;
}

Хочу заметить, что если вместо "set" подставить "ls, echo" и другое, то второй пример работает корректно, в чем же исключительность "set" ?


Ответы (1 шт):

Автор решения: Fat-Zer

Разница в том что set — это встроенная команда оболочки (built-in command) и её интерпретацией занимается сам /bin/sh, а ls — это отдельная программа /bin/ls.

echo — это особый случай: с одной стороны есть такая программа /bin/echo, а с другой, производительности ради, есть такая же команда оболочки. Так, например,

 execlp("sh", "sh", "-c", "echo --help", NULL);

выведет --help, а

 execlp("echo", "echo", "--help", NULL);

выдаст справку (по крайней мере для echo из GNU coreutils).

Определить, чем является команда, настоящей программой или чем-то ещё можно с помощью type:

$ type ls
ls — это псевдонимом для «ls --color=auto»
$ type -P ls
/bin/ls
$ type set
set — это встроенная команда bash

Список других встроенных команд (для bash) можно посмотреть соответственно в man bash.

→ Ссылка