Jak przekierować standardowe wejście i wyjście?

Obecnie programy, będące rozwiązaniami zadań, mają wczytywać dane wejściowe ze standardowego wejścia i zapisywać dane wyjściowe na standardowe wyjście. Jeśli uruchomimy program w najprostszy możliwy sposób, np. po to, żeby go przetestować, to wczytuje on dane z klawiatury, a wynik zapisuje na ekranie. Często chcielibyśmy jednak, żeby program pobrał dane z pliku i/lub do pliku zapisał. Można to zrobić przekierowując standardowe wejście i wyjście. Poniżej na przykładach pokazujemy, jak to zrobić w linii poleceń w systemach opracyjnych Windows i Linux.

Windows

Załóżmy, że mamy plik wykonywalny abc.exe w bieżącym katalogu. Aby wczytywał on dane z pliku abc.in piszemy następujące polecenie:

     abc.exe < abc.in 

Natomiast jeśli chcemy, aby zapisywał dane wyjściowe do pliku abc.out, to piszemy:

     abc.exe > abc.out 

ale musimy uważać, jeśli plik abc.out już istniał, bo utracimy jego dotychczasową zawartość. Oczywiście możemy zarówo z pliku wczytywać, jak i do pliku pisać, wykonując jedno z poniższych poleceń:

     abc.exe < abc.in > abc.out 
     abc.exe > abc.out < abc.in 

Powłoka PowerShell w Windowsie

PowerShell to nowa powłoka systemowa od MS dla systemów Windows (oparta na .NET). W aktualnej wersji nie działa w niej operator przekierowania standardowego wejścia '<' i trzeba sobie poradzić inaczej:

     Get-Content abc.in | .\prog.exe > abc.out

Dziękujemy Łukaszowi Niemierowi za podzielenie się powyższą wskazówką.

Linux

Załóżmy, że mamy plik wykonywalny abc w bieżącym katalogu. Aby wczytywał on dane z pliku abc.in piszemy następujące polecenie:

     ./abc < abc.in 

Natomiast jeśli chcemy, aby zapisywał dane wyjściowe do pliku abc.out, to piszemy:

     ./abc > abc.out 

ale musimy uważać, jeśli plik abc.out już istniał, bo utracimy jego dotychczasową zawartość. Oczywiście możemy zarówo z pliku wczytywać, jak i do pliku pisać, wykonując jedno z poniższych poleceń:

     ./abc < abc.in > abc.out 
     ./abc > abc.out < abc.in