>
выполняет open()
в режиме O_WRONLY|O_TRUNK
, а >>
выполняет open()
в режиме O_WRONLY|O_APPEND
, но для именованного канала это не имеет значения.
3 различных случая для рассмотрения:
open()
(, который выполняется оболочкой еще до выполнения команды, )будет блокироваться до тех пор, пока какой-либо процесс не откроет файл для чтения. open()
завершится успешно и создаст экземпляр канала. Затем команда будет запущена сразу и сможет записывать в канал, где данные будут накапливаться до тех пор, пока канал не заполнится или какой-либо процесс не прочитает содержимое на другом конце. open()
вернет fd в тот же канал (, а не создаст новый экземпляр ). Это означает, что запись, которую делает наша команда, будет чередоваться с записью других команд в канал. Записи гарантированно будут атомарными только в том случае, если они меньшеPIPE_BUF
(4 КБ в Linux ).Это ничем не отличается от обычных труб, созданныхpipe()
Режим открытия, который имеет значение, это O _RDWR (чтение+запись ), который в оболочках достигается с помощью оператора <>
(1<>
для перенаправления stdout, так как в противном случае он открывается на fd 0 (stdin )), который во многих системах никогда не блокирует и не создает экземпляр канала, если он еще не создан.
$ awk -F '|' 'NR==FNR{a[$1]; next} ($1 in a) || ($2 in a)' file1.txt file2.txt
A1234|B1465
G1241|L1212