Kommando mit sytem(command) ausführen



  • 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 😉


Anmelden zum Antworten