Что является различием между теми четырьмя командами (первым прибыл, первым обслужен, обработайте замену, перенаправление …),

Более простая опция состоит в том, чтобы использовать tput последовательности:

export PS1='\[$(tput setaf 4)\]\h\[$(tput sgr0)\] \[$(tput setaf 3)\]\w/\[$(tput sgr0)\]\n\[$(tput setaf 1)\]\$ →\[$(tput sgr0)\] '
8
15.06.2014, 14:04
1 ответ

Клавиша здесь в том, что открытие FIFO - это операция блокировки. Открытие возвращается только после соединения обоих концов, т.е. после открытия пятна для чтения и записи.

man fifo(7)

Normally, opening the FIFO blocks until the other end is opened also.

В 1-м случае вилки оболочки для выполнения конвейера, поэтому открытие пятна для чтения (cat fifo) и открытие пятна для записи (> fifo) происходят в отдельных процессах, поэтому происходят независимо друг от друга.

Во 2-м случае открытая для чтения и открытая для записи (3<>fifo) происходит в один этап.

В 3-м случае <(cat fifo) расширяется до имени файла, например, /dev/fd/42. Таким образом, вы как будто запускаете nc -l localhost 8888 /dev/fd/42 > fifo. Вам нужен дополнительный <, чтобы он был эквивалентен, например, nc -l localhost 8888 < <(cat fifo) > fifo.

В 4-ом случае оболочка пытается открыть fifo для чтения (< fifo) и открыть ее для записи (> fifo) как часть того же самого процесса. Оболочка делает их по одному, слева направо. Таким образом, она пытается открыть fifo для чтения и блокирует навсегда, ожидая, когда что-то откроется fifo для записи. Я думаю, что в этом случае, nc никогда даже не начинался, и порт никогда не открывался для прослушивания.

.
8
27.01.2020, 20:12

Теги

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