Kommando mit sytem(command) ausführen
-
Hallo,
ich führe in einem c programm system("ls -al") aus, was soweit funktioniert.
Was allerdings nicht geht ist das ganze in eine Datei umzuleiten
system("ls -al >& File") hier kommt die Fehler Meldung
"sh: 1: Syntax error: Bad fd number.Im Cli funtioniert ls -al >& File
Danke!
-
Probier mal "ls -al >File" ohne den Ampersand. Keine Ahnung wie du darauf kommst, >& ist eigentlich nur in Verbindung mit einer Zahl erlaubt (die den FD beschreibt). Wahrscheinlich ist es irgendeine Bash-Extensions, dass das kein Syntaxfehler gibt.
-
lsall schrieb:
Probier mal "ls -al >File" ohne den Ampersand. Keine Ahnung wie du darauf kommst, >& ist eigentlich nur in Verbindung mit einer Zahl erlaubt (die den FD beschreibt). Wahrscheinlich ist es irgendeine Bash-Extensions, dass das kein Syntaxfehler gibt.
"ls -al >File" funktioniert ich versuche ich das aber mit gcc
gcc -o LinuxCom LinuxCom.c > File wird nichts nach File geschrieben.
Mit gcc -o LinuxCom LinuxCom.c >& File aber schon wenn ich es direkt via shell starte.Mit system("gcc -o LinuxCom LinuxCom.c >& File") kommt dann der Fehler.
-
gcc gibt Meldungen standardmäßig auf stderr aus.
Probier bash mit &> als redirection operator. Das redirected dir stdout und stderr:
system("bash -c 'gcc -o LinuxCom LinuxCom.c &> File'")
-
popen() könnte helfen
-
stderr schrieb:
gcc gibt Meldungen standardmäßig auf stderr aus.
Probier bash mit &> als redirection operator. Das redirected dir stdout und stderr:
system("bash -c 'gcc -o LinuxCom LinuxCom.c &> File'")..&> File schreibt auch wieder nur nach File wenn ich das via shell mache.
Mit system() wird wieder nichts nach File geschrieben.
gigg schrieb:
popen() könnte helfen
hier kommt wieder die Fehler Meldung "sh: 1: Syntax error: Bad fd number.
-
Das liegt vermutlich daran, dass system() die Standartshell (Bourne Shell, sh) benutzt, du ansonsten aber bash.
Probiers mit "> File 2>&1", das ist sh-kompatibel und heißt:
Erst die Ausgabe nach File umleiten und dann den Filedeskriptor 2 (stderr) auf den Filedeskriptor 1 (stdout, das jetzt nach File umgeleitet ist).edit: Oder alternativ einfach "2> File", wenn du nur die Fehlerausgabe umleiten willst.
-
stderr schrieb:
gcc gibt Meldungen standardmäßig auf stderr aus.
Probier bash mit &> als redirection operator. Das redirected dir stdout und stderr:
system("bash -c 'gcc -o LinuxCom LinuxCom.c &> File'")system("bash -c 'gcc -o LinuxCom LinuxCom.c &> File'") funtioniert doch
Danke Dir!
-
#include <stdio.h> int main(void) { FILE *fz; fz = popen("ls -al > File", "w"); if(fz == NULL) { fprintf(stderr, "Fehler bei popen\n"); return 1; } pclose(fz); return 0; }
Also bei mir funktioniert das. Allerdings nicht: "ls -al >& File"
Da bekomme ich auf der Kommandozeile schon den Fehler:
"illegal file descriptor name".Habe allerdings ksh und nicht bash.
-
gigg schrieb:
#include <stdio.h> int main(void) { FILE *fz; fz = popen("ls -al > File", "w"); if(fz == NULL) { fprintf(stderr, "Fehler bei popen\n"); return 1; } pclose(fz); return 0; }
Also bei mir funktioniert das. Allerdings nicht: "ls -al >& File"
Da bekomme ich auf der Kommandozeile schon den Fehler:
"illegal file descriptor name".Habe allerdings ksh und nicht bash.
Habe mal mehrere Sachen ausprobiert.
fz = popen("gcc -o LinuxCom LinuxCom.c > File", "w"); //nichts in File fz = popen("gcc -o LinuxCom LinuxCom.c &> File", "w");// nichts in File fz = popen("gcc -o LinuxCom LinuxCom.c >& File", "w");//-> sh: 1:Syntax erros: Bad fd number fz = popen("ls -al > File", "w");// hier Funtioniert es
Mit dem gcc klappt das irgendwie nicht.
Mit
system("bash -c 'gcc -o LinuxCom LinuxCom.c &> File'")
funtioniert das super.
-
Das liegt, wie oben schon steht, daran, dass "&>" eine bash-Erweiterung ist und nicht mit anderen sh's funktioniert.
Und daran, dass du die Error-Messages von gcc willst (ausgegeben auf FD 2: stderr), und daher "2>" (nur Errors werden umgeleitet) oder "> file 2>&1" (alles wird umgeleitet) oder "&>" (alles wird umgeleitet, nur bash) brauchst.
-
philipp2100 schrieb:
Das liegt, wie oben schon steht, daran, dass "&>" eine bash-Erweiterung ist und nicht mit anderen sh's funktioniert.
Und daran, dass du die Error-Messages von gcc willst (ausgegeben auf FD 2: stderr), und daher "2>" (nur Errors werden umgeleitet) oder "> file 2>&1" (alles wird umgeleitet) oder "&>" (alles wird umgeleitet, nur bash) brauchst.Danke für die Infos, Linux ist für mich noch etwas Neuland.
-
np, dafür sind wir ja da