Более простая опция состоит в том, чтобы использовать tput
последовательности:
export PS1='\[$(tput setaf 4)\]\h\[$(tput sgr0)\] \[$(tput setaf 3)\]\w/\[$(tput sgr0)\]\n\[$(tput setaf 1)\]\$ →\[$(tput sgr0)\] '
Клавиша здесь в том, что открытие FIFO - это операция блокировки. Открытие возвращается только после соединения обоих концов, т.е. после открытия пятна для чтения и записи.
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
никогда даже не начинался, и порт никогда не открывался для прослушивания.