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 шт):
Разница в том что 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.