Если ваш ./run
будет выводить свой вывод на стандартный вывод, если не задан файловый аргумент (, который является обычным в Unix/Linux ), тогда вы можете просто использовать:
./run | xz -c >output.txt.xz
Если ему нужен аргумент имени файла, но если запись в канал работает нормально, вы можете использовать либо специальное устройство, такое как /dev/stdout
или/dev/fd/1
(оба должны быть эквивалентны ), например:
./run /dev/stdout | xz -c >output.txt.xz
Или вы можете использовать подстановку процесса , которая обычно доступна в большинстве современных оболочек, таких как bash, zsh или ksh, которая в конечном итоге будет использовать устройство из /dev/fd
за кулисами для выполнения то же:
./run >(xz -c >output.txt.xz)
Этот последний также нуждается в ./run
, чтобы иметь возможность писать в канал, но он должен работать лучше, чем другие, если ./run
записывает вoutput.txt
и в стандартный вывод в своей нормальной работе, в которой случае вывод будет перепутан, если вы перенаправите оба на стандартный вывод.
Программы обычно нормально записывают в канал, но некоторые из них могут захотеть выполнить поиск и перемотать смещения в выходном файле, что невозможно в канале. Если это так, то запись во временный файл, а затем его сжатие, вероятно, все, что вы можете сделать.
Это должна делать следующая программа:
$hhmmss="02:50:30";
@arr=split(':',$hhmmss);
$sec=@arr[2];
$sec+=@arr[1]*60;
$sec+=@arr[0]*3600;
print $sec;
$ perl -le '$t=shift;
($h,$m,$s) = split /:/, $t;
print $h * 3600 + $m * 60 + $s' 02:50:30
10230
или то же самое без переменной $t:
$ perl -l -e '($h,$m,$s) = split /:/, shift;
print $h * 3600 + $m * 60 + $s' 02:50:30
10230