2016-12-17 3 views
-1

Я создаю небольшую оболочку unix, execve имеет проблему с sed. Когда я выполняю команду sed -e 's/Roses/Turnips/', команда не работает с execve.execve with sed failed

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

int main(int ac, char **av, char **envp) 
{ 
    char *argv[] = { "/usr/bin/sed", "-e", "'s/Roses/Turnips/'", 0 }; 
    execve(argv[0], &argv[0], envp); 
    fprintf(stderr, "Failed!\n"); 
    return -1; 
} 

Ошибка:

/usr/bin/sed: -e expression #1, char 1: unknown command: `'' 
+0

Вы пытались избежать одиночных кавычек? – t0mm13b

ответ

1

Избавиться от одинарных кавычек вокруг s/// аргумента. Это часть синтаксиса оболочки, а не sed синтаксис.

char *argv[] = { "/usr/bin/sed", "-e", "s/Roses/Turnips/", 0 }; 

execve выполняет программу непосредственно, он не использует оболочку. Каждый аргумент передается буквально в программу, поэтому не требуется экранирование или кавычка, как при запуске программы в оболочке.

+0

и execve не выполняет оболочку. –

0

Эта проблема возникает внутри sed, потому что она не хочет ваших одиночных кавычек. Вы должны использовать эти одинарные кавычки в оболочке, чтобы предотвратить интерпретацию команды sed, но оболочка в конечном итоге удалит эти кавычки, что вам тоже нужно делать.