Выходной порядок с заменой процесса

Я использовал grub2 прежде при попытке к двойной загрузке kubuntu и человечностью. Я использовал это учебное руководство: http://www.dedoimedo.com/computers/grub-2.html#mozTocId16468. Это было чрезвычайно полезно и очень надежно.

"Двойная загрузка: две операционных системы с GRUB 2

Это - вероятно, самая простая конфигурация двойной загрузки. Обе операционных системы используют GRUB 2, таким образом, они могут легко взаимодействовать друг с другом. Этими двумя системами является Ubuntu 9.10 и Kubuntu 9.10, оба отформатированные с Ext4."

Надежда это полезно для людей, которые пытаются использовать этого.

11
20.12.2013, 01:40
2 ответа

В обоих

<file.txt  tee >(grep LITERAL) >(wc -l) >/dev/null

И:

{ { <file.txt tee /dev/fd/3 | grep LITERAL >&4; } 3>&1 | wc -l ;} 4>&1

Весь из tee, grep и wc запускаются одновременно. Что вопросы затем то, что происходит в конце.

wc только распечатает результат, когда он будет видеть конец файла на своем стандартном входе. В первом случае, именно тогда tee выходы, потому что затем tee закроет fd на другом конце канала это wc читает из (запущенный заменой процесса). Нет никакой гарантии этого grep считает весь его вход к тому времени, уже не говоря о записанном его вывод (учитывая, что каналы могут содержать вполне большой объем данных и это wc вероятно, будет быстрее, чем grep)

Во втором случае, wc будет видеть конец файла, когда все устройства записи к каналу, из которого он читает, закрыли свой конец канала. В этом случае, хотя, существует несколько устройств записи. tee (через его fd открываются на /dev/fd/3 и через его fd 3) и grep который также имеет fd 3 открытых для канала к wc (хотя это не делает использования из него, уже не говоря о записи к нему). Внутреннее { вероятно, вызовет дополнительный процесс подоболочки, который будет также иметь a fd 3 открытых и будут ожидать обоих tee и grep.

Это означает это wc только запишет его номер строки после grep вышел.

Вы записали этому надлежащий путь, который является путем закрытия fds, который не должен был открываться:

{ { <file.txt tee /dev/fd/3 4>&- | 
   grep LITERAL >&4 3>&- 4>&-; } 3>&1 | wc -l 4>&-;} 4>&1

Затем порядок не был бы гарантирован в оболочках, которые оптимизируют процесс подоболочки. Однако единственная оболочка, что я знаю это, делает ksh93 но ksh93 использование снабжает пар сокетом для каналов, таким образом, /dev/fd/3 не будет работать там над Linux, по крайней мере.

Для наблюдения, что выполняют процессы можно заменить grep с ps:

$ { { <file.txt tee /dev/fd/3 4>&- | ps -H >&4 3>&- 4>&-; } 3>&1 | wc -l 4>&-;} 4>&1
  PID TTY          TIME CMD
 8727 pts/5    00:00:00 bash
 8815 pts/5    00:00:00   bash
 8817 pts/5    00:00:00     tee
 8818 pts/5    00:00:00     ps
 8816 pts/5    00:00:00   wc

С bash, Вы видите, что дополнительный процесс оболочки, и видите, что ему также открыли канал на fd 3 с:

$ (p=$BASHPID; { { <file.txt tee /dev/fd/3 4>&- | lsof -ag "$p" -d3 >&4 3>&- 4>&-; } 3>&1 | wc -l 4>&-;} 4>&1)
COMMAND  PID PGID     USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
bash    9843 9842 chazelas    3w  FIFO    0,8      0t0 153304 pipe
tee     9845 9842 chazelas    3w  FIFO    0,8      0t0 153304 pipe
lsof    9846 9842 chazelas    3r   DIR    0,3        0      1 /proc
4
27.01.2020, 19:59
  • 1
    Спасибо. В Вашем "надлежащем примере", что делает grep LITERAL >&4 3>&- 4>&- средний, fd 4, кажется, и используется и закрывается? –  iruvar 20.12.2013, 04:59
  • 2
    @1_CR, после >&4, короткий для 1>&4, grepfd 1 и 4 точки к тому же ресурсу (начальная буква оболочки stdout). grep не должен иметь его fd 4, открытого ни для чего. Это ничего не делает с ним, таким образом, мы закрываем его с 4>&- –  Stéphane Chazelas 20.12.2013, 10:10
  • 3
    Та последняя командная строка является загадочным волшебством. –   20.12.2013, 15:02

Получить предсказуемое использование порядка

(<file.txt  tee >(grep LITERAL) >(wc -l) >/dev/null)|sort
-1
27.01.2020, 19:59
  • 1
    , Возможно, я не был достаточно ясен. Я имел в виду предсказуемый порядок с точки зрения порядка выводов команды (т.е. произведите от grep, прежде чем произведено из туалета). Мне не нужен отсортированный –  iruvar 19.12.2013, 18:47
  • 2
    объединенного вывода, просто нашел gnu.org/software/bash/manual/bashref.html#Command-Grouping, он говорит мне, что с {} операторы Вы удостоверяетесь (в этом случае), что сначала делаете мишень <file.txt/dev/fd/3 | grep ЛИТЕРАЛ> &4; и когда это сделано, Вы называете туалет, так для ответа на исходный вопрос, да он гарантируется моему –  Thorsten Staerk 19.12.2013, 18:49
  • 3
    @ThorstenStaerk понимания, Вы могли добавить дополнительную информацию, которую Вы нашли к своему ответу? –  terdon♦ 19.12.2013, 18:52
  • 4

Теги

Похожие вопросы