Как использовать cd и vi в функции execl

Я хочу использовать функцию execl для вызова обеих команд cd и vi из моей программы на языке C, но она не работает. Вот что я сделал для rm и ls:

execl("/bin/ls", "ls", NULL);
execl("/bin/rm", "rm", args[1], NULL); //args is the array containing the arguments of the command

Это работает для ls и rm, но когда я пытаюсь сделать то же самое с vi и cd, это не работает.


person Sara Elouafiq    schedule 22.09.2017    source источник
comment
Около 10 минут назад был этот вопрос. И почему-то ваши cd и vi не совпадают по коду с ls и rm.   -  person Eugene Sh.    schedule 22.09.2017
comment
Если вы попытаетесь выполнить cd, это не сработает, отчасти потому, что cd является встроенной в оболочку, а не отдельной программой, которую вы можете выполнять, а также потому, что если вы измените каталог в подпроцессе, это не повлияет на родительский процесс ( именно поэтому он должен быть встроен в оболочку). vi, с другой стороны, должен был работать, если только, возможно, не было проблем с доступом к терминалу - поскольку, конечно, это очень интерактивная программа.   -  person Steve Summit    schedule 22.09.2017
comment
Каков режим сбоя при попытке выполнить vi? Можете ли вы показать нам точный код, который вы использовали для этого?   -  person Steve Summit    schedule 22.09.2017
comment
Поскольку вы не показываете сбойный код, трудно понять, что пошло не так. На Mac есть есть команда /usr/bin/cd, но она имеет очень и очень ограниченное применение — команда меняет каталог, но не влияет на вызывающую программу. (Если я запускаю /usr/bin/cd /some/where/non-existent, он выдает сообщение об ошибке /usr/bin/cd: line 4: cd: /some/where/non-existent: No such file or directory. Таким образом, его можно использовать для проверки существования и доступности целевого каталога, но это все. И да, это сценарий оболочки.)   -  person Jonathan Leffler    schedule 22.09.2017
comment
Обратите внимание, что если вы пишете оболочку, вы не будете использовать execl() очень часто. Вам нужно будет использовать execv(), execvp(), execve() или execvpe() в зависимости от контекста и того, что доступно.   -  person Jonathan Leffler    schedule 22.09.2017
comment
Как и в вопросе, который я связал в первом комментарии: вы не можете использовать функции exec* одну за другой, поскольку в хорошем случае они просто не возвращаются.   -  person Eugene Sh.    schedule 22.09.2017
comment
Лучше использовать execl("/bin/ls", "ls", (char*)NULL); для редких платформ, которые не делают NULL того же размера/кодировки, что и char*. OTOH, у такой машины может не быть execl().   -  person chux - Reinstate Monica    schedule 22.09.2017