LINUX.ORG.RU

Ответ на: комментарий от sr11

Если у кота есть опции то результат отличается

mi-o6% ls | cat -en | wc < test5.c

  77     175    1200

mi-o6% {ls; cat -en test5.c} | wc

  77     211    1455

mi-o6% {cat -en test5.c; ls} | wc

  77     210    1455
diosio
() автор топика

wc принимает и обсчитывать сразу несколько файлов.

Итого:

$ wc file.txt <(ls)
     62     120    1377 file.txt
     20      20     225 /dev/fd/63
     82     140    1602 итого
surefire ★★★
()
Ответ на: комментарий от anonymous

Я не прошу сделать за меня. А спрашиваю как объединить pipe и файл, чтобы подать это на ввод

diosio
() автор топика

Если ты в bash сделаешь что-то вроде

# создадим файл testfile c текстом "abc\n"
echo abc > testfile

#тут в cat попадет только "abc\n" из testfile, "123\n" туда никак не допишется
echo 123 | cat < testfile 
можешь сам проверить

SZT ★★★★★
()

программа должна объединить данные из pipe и файла

Ну так напиши на Си программу, которая на вход в wc сначала пишет данные из файла, а потом из какого-то pipe (или наоборот, сначала из pipe потом из файла)

SZT ★★★★★
()
Последнее исправление: SZT (всего исправлений: 1)
Ответ на: комментарий от SZT

Предлагаешь подключать через fork свой бинарник который будет объединять pipe и файл и потом уже это подавать на ввод? Просто думаю вот как в zsh это реализовано, sh и bash по отдельности посылаются pipe и файл

diosio
() автор топика
Ответ на: комментарий от SZT

Ну тут просто реализация конвейера без перенаправления потоков. Эта часть у меня сделана. У меня именно проблема с < file, как объединить 2 потока

diosio
() автор топика
Ответ на: комментарий от diosio

У меня именно проблема с < file, как объединить 2 потока

Ты думаешь что если ты напишешь что-то вроде echo 123 | some_command < somefile - у тебя в твою some_command в stdin попадет и 123 из echo и содержимое файла somefile в каком-то порядке? Но ведь в bash это так не работает, можешь сам проверить. Я выше привел пример Как объединить 2 потока (комментарий)

SZT ★★★★★
()
Ответ на: комментарий от diosio

Если надо объединять - делай пайп, в пайп пиши stdout какой-то команды, потом пиши файл. И из пайпа читай потом.

SZT ★★★★★
()
Ответ на: комментарий от SZT

В bash нет, а в zsh да Я хочу попробовать сделать как в zsh

diosio
() автор топика
Ответ на: комментарий от SZT

Ну вот у меня и проблема что не получается в pipe записать содержание файла. Пытался используя read, write. Можно конечно cat вызвать и им записать, но думаю это такое себе решение проблемы

diosio
() автор топика
Ответ на: комментарий от diosio

А что конкретно не получается? Вот тебе пример когда 10 байт из файла в файл через пайп записывается:

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>

int main(void)
{
  pid_t childpid;
  int fd_file_read;
  int fd_file_write;
  int fd_pipe[2];
  char buf[10];

  if( pipe(fd_pipe) < 0)
  {
    perror("pipe");
    return EXIT_FAILURE;
  }

  if ((fd_file_read = open("testfile", O_RDONLY)) < 0)  
  { 
    perror("file_read"); 
    return EXIT_FAILURE;
  }

  if ((fd_file_write = open("testfile_out", O_CREAT | O_WRONLY | O_TRUNC, 0666)) < 0)  
  { 
    perror("file_write"); 
    return EXIT_FAILURE;
  }

  if((childpid = fork()) == -1)
  {
    perror("fork");
    return EXIT_FAILURE;
  }

  if(childpid == 0)
  {
    close(fd_pipe[0]);

    read(fd_file_read, buf, sizeof(buf));
    write(fd_pipe[1], buf, sizeof(buf));
    close(fd_file_read);
  }
  else
  {
    close(fd_pipe[1]);

    read(fd_pipe[0], buf, sizeof(buf));
    write(fd_file_write, buf, sizeof(buf));
    close(fd_file_write);
  }

  return EXIT_SUCCESS;
}

Можно еще использовать вызов splice для пайпов.

SZT ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.