GNU/Linux >> Znalost Linux >  >> Linux

Jak přesměrovat výstup system() do souboru?

stdout je FILE * ukazatel standardního výstupního proudu. dup2 očekává deskriptor souboru, také jste zpackali parametry order.Use

dup2(file, 1);

místo toho.

Na lepší způsob, jak to udělat. Tento způsob je špatný, protože pravděpodobně budete chtít obnovit svůj standardní výstup po tomto system hovor se dokončí. Můžete to udělat různými způsoby. Můžete dup to někam a pak dup2 jej zpět (a zavřete dup ped jeden). Osobně nerad píšu vlastní cat implementace, jak je navrženo v jiných odpovědích. Pokud jediné, co chcete, je přesměrování jediného příkazu shellu s system do souboru v souborovém systému, pak pravděpodobně nejpřímějším a nejjednodušším způsobem je vytvořit příkaz shell, který to udělá jako

system("ls -l > Result");

Ale musíte být opatrní, pokud název souboru (Výsledek) pochází z uživatelského vstupu, protože uživatel může zadat něco jako 'Result; rm -rf /*' jako název souboru.

Pokud jde o zabezpečení, měli byste zvážit zadání úplné cesty k ls jak je navrženo v komentářích:

system("/bin/ls -l > Result");

Jednoduchá věc je použít > skutečně:

#include <stdio.h>
int main()
{
    system("ls -l > /some/file");

    return 0;
}

Alternativou je použití popen() , něco ve smyslu

   #include <stdio.h>
   #include <stdlib.h>
   main()
   {
           char *cmd = "ls -l";
           char buf[BUFSIZ];
           FILE *ptr, *file;

           file = fopen("/some/file", "w");
           if (!file) abort();
           if ((ptr = popen(cmd, "r")) != NULL) {
                   while (fgets(buf, BUFSIZ, ptr) != NULL)
                           fprintf(file, "%s", buf);
                   pclose(ptr);
           }
           fclose(file);
           return 0;
   }

Měli byste použít popen() funkce knihovny a čtení částí dat z vráceného FILE * a zapište je do libovolného výstupního souboru.

Reference.


Linux
  1. Jak přesměrovat výstup programu do souboru ZIP?

  2. Přesměrování a výstup potrubí?

  3. Linux – jak často je systém souborů Proc aktualizován v systému Linux?

  1. Jak přesměrovat výstup již běžícího procesu

  2. Jak nasměruji nebo přesměruji výstup curl -v?

  3. Jak přesměrovat výstup příkazu time do souboru v Linuxu?

  1. Jak přesměrovat výstup do souboru a Stdout v Linuxu

  2. Jak přesměrovat výstup služby systemd do souboru

  3. Jak přesměrovat výstup příkazu do souboru, když příkaz vyzve uživatele k zadání?