Как узел в конвейере Bash может просматривать, но не потреблять входной поток?

На самом деле существует небольшая разница между коммутатором и концентратором. Концентратор не хранит MAC-адреса подключенных устройств, поэтому пакеты, полученные от любого хоста, достигают всех остальных подключенных хостов. пакет соответствующему получателю, чьи данные (, такие как mac,ip ), упоминаются в заголовках пакетов....

0
03.02.2020, 20:52
4 ответа

Я могу придумать простой подход — использовать временное хранилище для вывода. Это можно сделать с минимальной модификацией вашего кода, например:

atmp=$(mktemp "/tmp/XXXXXX")

printf "%s\n" a b print c | tee $atmp | 
  if grep --quiet print
  then
    grep print $atmp 
  fi  
rm $atmp #cleanup

Для небольших объемов производства это может быть приемлемым.

2
28.04.2021, 23:24

Другой подход, аналогичный ответу @Tagwint , состоит в том, чтобы сохранить результат grep printв переменной оболочки, а затем вывести содержимое этой переменной только при наличии результатов поиска:

printf "%s\n" a print b print c |
 if result=$(grep print)
 then
   echo "$result";
 fi

Выход:

print
print

Это допустимо, если результаты поиска не слишком велики.

0
28.04.2021, 23:24

Я также решил проблему в этом конкретном примере, используя fionread, который @mosvy реализовал в своем ответе наКак проверить, пуст ли канал, и запустить команда на данных, если это не так?.

printf "%s\n" a b print c | grep print |./fionread echo found

Выход:

found
printf "%s\n" a b c | grep print |./fionread echo found

Выход:


Обратите внимание, что gccлегко компилируется fionread.cна FreeBSD 11.3:

$ gcc -o fionread fionread.c
$ echo test | grep test |./fionread echo found
found
$ echo | grep test |./fionread echo found
$
0
28.04.2021, 23:24

Хотя это и не стандартная утилита Unix или скрипт Bash, я решил решить проблему в этом конкретном примере, используяifneиз moreutils:

printf "%s\n" a b print c | grep print | ifne echo found

Выход:

found
printf "%s\n" a b c | grep print | ifne echo found

Выход:


@Nick Wirth сослался на lfneв своем ответе наКак проверить, пуст ли канал, и запустить команду для данных, если это не так?.

Спасибо @mosvy за то, что направили меня на этот существующий вопрос.

0
28.04.2021, 23:24

Теги

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