Почему / dev / stderr недействителен при перенаправлении на канал в cygwin?

Если шаблон остается прежним , вы можете использовать

grep -B 3 '# 0 hits found'

Это напечатает все строки, содержащие # 0 найденных совпадений и три строки до совпадения.

Различные совпадения разделены строкой, состоящей из --. Поэтому вы можете добавить | grep -v '^--' к команде.

0
10.07.2017, 00:59
2 ответа

Имя /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предоставлено для того, чтобы избежать хлопот с выяснением фактической цели.

4
28.01.2020, 02:16

Я думаю, проблема в порожденном процессе readline -. Он получает собственный канал для перенаправления, который закрывается, когда процесс останавливается (pid, который вы получаете, не тот, что у оболочки, а у процесса readlink -). Канал становится недействительным при завершении процесса. Попробуйте использовать fifos/именованные каналы.

1
28.01.2020, 02:16

Теги

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