Я использовал grub2 прежде при попытке к двойной загрузке kubuntu и человечностью. Я использовал это учебное руководство: http://www.dedoimedo.com/computers/grub-2.html#mozTocId16468. Это было чрезвычайно полезно и очень надежно.
"Двойная загрузка: две операционных системы с GRUB 2
Это - вероятно, самая простая конфигурация двойной загрузки. Обе операционных системы используют GRUB 2, таким образом, они могут легко взаимодействовать друг с другом. Этими двумя системами является Ubuntu 9.10 и Kubuntu 9.10, оба отформатированные с Ext4."
Надежда это полезно для людей, которые пытаются использовать этого.
В обоих
<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
Получить предсказуемое использование порядка
(<file.txt tee >(grep LITERAL) >(wc -l) >/dev/null)|sort
grep LITERAL >&4 3>&- 4>&-
средний, fd 4, кажется, и используется и закрывается? – iruvar 20.12.2013, 04:59>&4
, короткий для1>&4
,grep
fd 1 и 4 точки к тому же ресурсу (начальная буква оболочки stdout).grep
не должен иметь его fd 4, открытого ни для чего. Это ничего не делает с ним, таким образом, мы закрываем его с4>&-
– Stéphane Chazelas 20.12.2013, 10:10