Если шаблон остается прежним , вы можете использовать
grep -B 3 '# 0 hits found'
Это напечатает все строки, содержащие # 0 найденных совпадений
и три строки до совпадения.
Различные совпадения разделены строкой, состоящей из --
. Поэтому вы можете добавить | grep -v '^--'
к команде.
Имя /dev/stderr
действительно допустимо при перенаправлении в канал. Что может быть невозможно, так это открыть конечную цель /dev/stderr
напрямую. Просто посмотрите:
$ (echo Testing testing > /dev/stderr) |& cat
Testing testing
Канал, созданный |
или |&
, обычно является анонимным каналом ; отображаемое имя не соответствует объекту в файловой системе . Для иллюстрации вы можете попробовать что-то простое, например:
$ ls -la /dev/fd/ |& cat
total 0
dr-x------ 2 alexp alexp 0 Jul 6 18:23.
dr-xr-xr-x 9 alexp alexp 0 Jul 6 18:23..
lrwx------ 1 alexp alexp 64 Jul 6 18:23 0 -> /dev/pts/4
l-wx------ 1 alexp alexp 64 Jul 6 18:23 1 -> pipe:[1058859]
l-wx------ 1 alexp alexp 64 Jul 6 18:23 2 -> pipe:[1058859]
lr-x------ 1 alexp alexp 64 Jul 6 18:23 3 -> /proc/4335/fd
Очень необычно пытаться открыть (конечную )цель /dev/stderr
; имя /dev/stderr
предоставлено для того, чтобы избежать хлопот с выяснением фактической цели.
Я думаю, проблема в порожденном процессе readline -. Он получает собственный канал для перенаправления, который закрывается, когда процесс останавливается (pid, который вы получаете, не тот, что у оболочки, а у процесса readlink -). Канал становится недействительным при завершении процесса. Попробуйте использовать fifos/именованные каналы.