2016-12-17 14 views
-1

Ich erstelle eine kleine Unix-Shell, Execve hat ein Problem mit sed. Wenn ich sed -e 's/Roses/Turnips/' ausführe, schlägt der Befehl mit Execve fehl.Execve mit Sed fehlschlägt

#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; 
} 

Fehler:

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

haben Sie versucht, die einfachen Anführungszeichen zu umgehen? – t0mm13b

Antwort

1

Lassen Sie sich rund um die s/// Argument der Apostrophe befreien. Diese sind Teil der Shell-Syntax, nicht sed Syntax.

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

execve führt das Programm direkt, ist es nicht eine Schale nicht verwendet. Jedes Argument wird wortwörtlich an das Programm gesendet, so dass kein Leeren oder Quotieren erforderlich ist, wie wenn ein Programm in der Shell ausgeführt wird.

+0

und Execve führt keine Shell aus. –

0

Dieses Problem tritt innerhalb sed auf, weil es Ihre einfachen Anführungszeichen nicht will. Sie würden diese einfachen Anführungszeichen in einer Shell verwenden, um zu verhindern, dass sie den Befehl sed interpretiert, aber die Shell würde schließlich diese Anführungszeichen entfernen, was Sie ebenfalls tun müssen.