/ / Wyślij wyjście z exec do pliku perl - bash, perl

Wyślij dane wyjściowe z exec do pliku perl - bash, perl

Problem

Podczas uruchamiania exec w perlu nie mogę przekierować danych wyjściowych do pliku.

Używam vlc w exec, ale ponieważ wątpię, czy wszyscy go skonfigurowali, zastąpiłem echo poniżej, pokazuje to samo zachowanie dla przykładu.

Interesuje mnie tylko exec „command”, „args” formatu exec, a nie ten, który tworzy powłokę, ponieważ tworzy podpowłokę z vlc, która nadal drukuje na ekranie + inne problemy z czystym zabijaniem.


Kod

use strict;
use warnings;

my $pid = fork;
if (!defined $pid) {
die "Cannot fork: $!";
}
elsif ($pid == 0) {
exec "/usr/bin/echo","done";
}

Wypróbowany

exec "/usr/bin/echo","done",">/dev/null";

Zgodnie z oczekiwaniami po prostu drukuje „> / dev / null”, ale warto było spróbować.

exec "/usr/bin/echo done >/dev/null";

Uruchamia sh, które następnie uruchamia echo, działa tutaj, ale nie w moim aktualnym problemie z vlc, myślałem, że i tak dołączę, ponieważ ktoś na pewno to zasugeruje.

Pytanie

Jak przekierować dane wyjściowe z tego exec przy użyciu polecenia „command”, „args” do pliku?

Dodatkowy

Wszelkie potrzebne informacje proszę pytać.

Odpowiedzi:

3 dla odpowiedzi № 1

Okazuje się, że możesz po prostu zmienić deskryptory plików przed exec

use strict;
use warnings;

my $pid = fork;
if (!defined $pid) {
die "Cannot fork: $!";
}
elsif ($pid == 0) {
open STDOUT, ">", "/logger/log" or die $!;
open STDERR, ">", "/logger/log" or die $!;
exec "/usr/bin/echo","done";
}

0 dla odpowiedzi nr 2

Przypuszczam, że jeśli wystarczy wydrukować do pliku, powinno to działać.

najłatwiejszym sposobem przechwytywania danych wyjściowych jest użycie backticks.

use strict;
use warnings;

open (my $file, ">", "output.log");
my $pid = fork;
if (!defined $pid) {
die "Cannot fork: $!";
}
elsif ($pid == 0) {
print $file `/usr/bin/echo done`;
}