операции компоновки экрана в .screenrc не работают

grep's -o выводит только совпадения, игнорируя строки; wc может их подсчитать:

grep -io "nicolas bomber" annuaire | wc -l

или просто,

grep -ioc "nicolas bomber" annuaire

Как вы прокомментировали, вы можете найти любое количество пробелов между словами, используя опцию -z,

grep -iz "nicolas[[:space:]]*bomber" annuaire | wc -l

Из man grep

-i, --ignore-case
    Ignore case distinctions in both the PATTERN and the input files.  (-i is specified by POSIX.)    

-o, --only-matching
    Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line.

-c, --count
    Suppress  normal  output;  instead  print  a  count  of  matching  lines  for each input file.

Альтернативно, если вы хотите искать строку в конкретном расширении файла, например, скажем, все *. txt файлы, вы можете использовать:

grep -R --include='*.txt' -ioc "nicolas bomber" .
2
14.02.2017, 11:33
1 ответ

Вы обнаружили ошибку. И при этом неприятный.

Семейство команд макета , похоже, зависит от управляющего терминала (для работы команды должен присутствовать TTY или PTS). Я могу воспроизвести проблему, не просматривая crontab :

Я добавляю следующее к моему .screenrc :

layout new lay1
split -v
layout new lay2
split -v
layout attach lay2

Запуск экран напрямую дает мне макет :

screen

Но выполнение следующего не может найти макеты :

screen -dm && screen -r

В последней команде я все еще могу перечислить макеты, используя : layout show , но, черт возьми, теперь это когда ошибка становится неприятной. Если я попытаюсь изменить макет (с помощью : layout next или : layout prev ), экран попадет в бесконечный цикл.

Более того, поскольку двоичный файл screen в моей системе является корнем SUID (мне нужна многопользовательская поддержка), ошибка становится еще хуже. После того, как пользовательский процесс был убит, корневой процесс запускает бесконечный цикл и в конечном итоге дает сбой. Возможность сбоя процесса SUID или даже просто возможность создания нескольких корневых процессов, высасывающих ресурсы ЦП в бесконечных циклах, очень опасна.

Я тестировал его на вашей версии экрана (4.3.0), а также на 4.5.0 (последняя версия), где ошибка все еще существует. Я собираю исходный код с помощью -DDEBUG и сообщаю об ошибке команде разработчиков screen. Экран -DDEBUG дает сбой:

ASSERT(l->l_cvlist != cv) failed file canvas.c line 294

Следовательно, вероятно, что бесконечный цикл пытается найти что-то в этом связанном списке и снова и снова дает сбой.

Экран обходного пути

позволяет привязать метод eval . Поэтому вы можете добавить в свой .screenrc что-то вроде:

bind g eval 'layout new default' 'split -v' 'resize 60%' 'split -h' 'layout select default'

Хакерская часть состоит в том, что должен быть в одной строке, screen не имеет никакого способа экранировать длинные строки в .screenrc . Затем вы можете получить макет одним (а точнее, двойным) нажатием клавиши после выхода на экран ( Ctrl + a g ).

g обычно привязан к системному звонку, поэтому вы не должны пропустить его. Но вы можете привязать любую понравившуюся клавишу.

2
27.01.2020, 22:19

Теги

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