Нет. ls
не имеет этой возможности (и немногие хотели бы ее к).
Назначение Ctrl+C из клеммы посылает SIGINT
в группу процесса на передний план. Если необходимо, чтобы wc
пережил это событие и выдал выход, необходимо, чтобы он игнорировал сигнал.
Решение заключается в том, чтобы запустить wc
в подоболочке и заставить ее родительский набор оболочки SIGINT
игнорироваться перед запуском wc
. Wcwc
наследует эту установку и не умирает, когда SIGINT SIGINT
отправляется в группу процессов. Остальная часть трубопровода погибнет, оставив wc
показания из трубы, которая не имеет процесса на другом конце. Это приведет к тому, что wc
увидит EOF
на трубе, а затем выведет свои отсчеты и выйдет.
ngrep -W byline port 80 and dst host 1.2.3.4 | grep ":80" | (trap '' INT ; wc)
Вот как вы можете продолжать подсчет после считывания текущего счетчика:
Моим непрерывным источником тестового ввода является пинг:
$ ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.041 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.028 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.025 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.045 ms
64 bytes from 127.0.0.1: icmp_seq=5 ttl=64 time=0.032 ms
64 bytes from 127.0.0.1: icmp_seq=6 ttl=64 time=0.030 ms
^C
С другими решениями мы должны были решить, когда считывали количество строк и прерывали выполняющуюся команду.
Но в идеале мы просто хотели бы знать текущее количество строк, не так ли?
Так почему бы просто не посчитать строки? Правильный инструмент для работы - nl
, добавляя текущий счетчик перед каждой строкой:
$ ping 127.0.0.1 | nl
1 PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
2 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.040 ms
3 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.022 ms
4 64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.025 ms
5 64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.021 ms
6 64 bytes from 127.0.0.1: icmp_seq=5 ttl=64 time=0.022 ms
7 64 bytes from 127.0.0.1: icmp_seq=6 ttl=64 time=0.022 ms
8 64 bytes from 127.0.0.1: icmp_seq=7 ttl=64 time=0.021 ms
9 64 bytes from 127.0.0.1: icmp_seq=8 ttl=64 time=0.029 ms
^C
Вы можете использовать:
$ ngrep -W byline port 80 and dst host 1.2.3.4 | grep ":80" |
perl -nle 'system("clear");print $.'
perl
будет отслеживать, какие строки у вас были, очистите старый вывод перед печатью.
Если вы хотите указать ограничение по времени (а не просто делать это с манжеты), вы могли бы использовать этот трюк
( cmdpid=$BASHPID; (sleep 300; kill $cmdpid) & exec ngrep (ngrep args) ) | grep ":80" | wc
, вдохновленный этим ответом на недавний вопрос. на SU; по сути Как остановить запущенную программу через 5 минут и продолжить?