sed -e '
# not interested in empty lines or blank lines
/^$/b
/\S/!b
N; # get the next line into pattern space
/^\(.*\)\n\1$/!{P;D;}; # compare 2 in the pattern space as string eq
/\nnot a color$/b; # 2 EQUAL, they are "not a color" => NOP
s/$/ is a color/; # 2 EQUAL, but not "not a color" => suffix
' your_colors.file
В каждой итерации вашего цикла read
будет открывать канал для чтения, читать строку данных, а затем закрывать его.
Если iotop
решит попытаться записать в канал, когда read
не читает из него активно, он получит сигнал PIPE
, так как пытается записать в канал, из которого никто не читает. По умолчанию при получении сигнала PIPE
процесс завершается.
Вместо того, чтобы открывать и закрывать канал для чтения в цикле (и надеяться, что iotop
не будет писать в канал, пока он не читается из ), перенаправить ввод из канала в цикл сама:
pipe=./diskfifo
while read word; do
[ "$word" = 'quit' ] && break
printf '%s\n' "$word"
done <"$pipe"
Это будет держать трубу открытой на протяжении всего цикла. Каждый вызов read
будет наследовать свой стандартный входной поток от стандартного ввода цикла, который подключен к каналу.
Возможная другая формулировка цикла:
while read word && [ "$word" != 'quit' ]; do
printf '%s\n' "$word"
done <"$pipe"