2016-12-09 9 views
0

Я пытаюсь использовать file.cpp для выполнения некоторых простых команд bash. Код работает для таких команд, как ls, gedit, echo, но сбой при cd команда.Выполнение команд Bash с использованием кода C

Вот мой file.cpp:

#include <stdio.h> 
#include <unistd.h> 

int main() { 
    char *cd[] = { 
     "/bin/bash", 
     "-c", 
     "cd /etc", 
     NULL 
    }; 
    execvp(cd[0], cd); 
    return 0; 
} 

я выполнить его после компиляции с помощью ./file и мой выходной терминал,

[email protected]:~/Desktop$ g++ -Wno-write-strings file.cpp -o file 
[email protected]:~/Desktop$ ./file 
[email protected]:~/Desktop$ 

Текущий каталог не изменится /etc. Я попытался изменить cd /etc на cd .., cd some_directory в file.cpp, но не удался.

Просьба указать, что я делаю неправильно.

+2

Команды 'exec' обычно запускаются в их собственной среде. Как и в случае, они не будут влиять ни на что другое, как на процесс, из которого вы их вызвали. – Iluvatar

ответ

2

Каждый процесс имеет свой собственный текущий каталог.

При запуске /bin/bash -c "cd /etc" Bash запускается, меняет текущий каталог, а затем выходит. Это происходит независимо от того, запускаете ли вы его с exec или fork, затем exec или system, либо введя его в оболочку или каким-либо другим способом.

Он не влияет на текущий каталог оболочки, из которой вы ее запускали.

+0

Итак, есть ли способ увидеть эти изменения в текущей сессии терминала? – Rahul

+0

@Rahul Нет, нет. – immibis

+1

no - потому что изменений в текущем сеансе нет. Вы не можете делать то, что вы пытаетесь сделать. 'cd' - это команда, встроенная в оболочку, ее не программа (vs' ls' или 'mkdir') – pm100

Смежные вопросы