Как постоянно изменить и STDOUT и цвет STDERR к серому?

Большинство дистрибутивов Linux включает параметры конфигурации, используемые для компиляции ядра в /boot/config-<kernel-version>.

Так

grep -x 'CONFIG_PACKET=[ym]' "/boot/config-$(uname -r)"

Должен сказать Вам если AF_PACKET поддержка сокета включена (m поскольку как модуль).

Иначе можно просто попытаться создать сокет (использование socket(2), посмотрите packet(7) поскольку, как сделать это) в семействе AF_PACKET и проверке, если отчеты ошибка.

7
13.04.2017, 15:36
3 ответа

С помощью zsh на терминалах, поддерживающих 16 или более цветов ля xterm:

preexec() printf '\e[90m' # set foreground color to grey before running
                          # the command

precmd() printf '\e[m' # reset the foreground color before issuing the
                       # next prompt.

Обратите внимание, что команды могут сами изменять цвет переднего плана терминала.

7
27.01.2020, 20:15

STDOUT и STDERR не имеют цветов. То, что имеет цвет, является вашим терминалом (эмулятором); он имеет один передний план (и один цвет фона) одновременно.

Также следует отметить, что STDOUT и STDERR не являются единичными - это для каждого процесса выходных потоков. Нет глобального STDOUT, который применялся бы ко всем программам. Эти потоки направляются на ваш терминал, но они специфичны для каждого процесса.

Эмуляторы терминала обычно имеют возможность задать палитру через меню, так что по умолчанию передний план (применяется к данным, полученным через и через потоки STDOUT и STDERR) может быть любым. Вы также можете применить коды цвета ANSI в своем запросе и , если вы не сбросите цвет с помощью \[\033[0m\] в конце, он будет продолжать применяться. Обратите внимание, что некоторые приложения используют их и сбрасывают, так что это не очень идеальный метод, так как сбрасывание вернется к терминалу по умолчанию.

Если настройка терминала на переднем плане - не то, что вы хотите, вы можете отфильтровать STDOUT/STDERR на основе каждого процесса; смотрите предложения здесь.

.
8
27.01.2020, 20:15

Предполагая, что у вас достаточно памяти для приостановки файла, вы можете попробовать

perl -e 'use List::Util 'shuffle'; @k=shuffle(<>); print @k[0..999]' file.bed

Поскольку вы хотите сделать это 10000 раз, я бы рекомендовал интегрировать повторение в сценарий и перетасовать индексы , а не сам массив для ускорения:

$ time perl -e 'use List::Util 'shuffle'; 
            @l=<>; for $i (1..10000){
               open(my $fh, ">","file.$i.bed"); 
               @r=shuffle(0..$#l); 
               print $fh @l[@r[0..999]]
            }' file.bed

real    1m12.444s
user    1m8.536s
sys     0m3.244s

Выше создано 10000 файлов по 1000 строк каждый из файла, который содержал 37000 строк (пример файла повторяется 1000 раз). Как видите, на мою систему ушло чуть больше трех минут.

Объяснение

  • используйте List:: Util 'shuffle'; : импортирует модуль Perl, предоставляющий функцию shuffle () , которая рандомизирует массив.
  • @ l = < >; : загрузите входной файл ( < > ) в массив @ l .
  • для $ i (1.. 10000) {} : запустите этот 10000 раз.
  • @ r = shuffle (0.. $ # l); : $ # l - количество элементов в @ l , поэтому @ r теперь является рандомизированным списком индексных номеров массива @ l (строки входного файла).
  • открыть (мои $ fh, «>», «файл. $ i.bed»); : открыть файл с именем файл. $ i.bed для записи. $ i будет принимать значения от 1 до 10000.
  • print $ fh @ l [@ r [0.. 999]]] : возьмите первые индексы 1000 в перетасованном массиве и напечатайте соответствующие строки (элементы @ l ).

Другой подход заключается в использовании shuf ( thanks @ frostschutz ):

$ time for i in {1..10000}; do shuf -n 1000 file.bed > file.$i.abed; done

real    1m9.743s
user    0m23.732s
sys     0m31.764s
-121--36529-

Есть много способов сделать это, конечно, но почему вы хотите? Это то, что файл fstab является для .

Некоторые идеи:

  • Создайте системное монтирование или автомонтирование (или просто простой сценарий запуска, выполняющий монтирование ).
  • Для запуска монтирования используйте crontab.
  • Наличие сценария запуска в среде рабочего стола.
  • Найдите инструмент в официальных репо или AUR, который сделает это для вас (у меня нет рекомендации).
  • Вставьте злой взлом, где бы вы ни выбрали.
-121--114493-

Это, похоже, вопрос с XY-проблемой - она не просит нужного решения:

Предположим, что выход окрашен, а пустая часть экрана имеет другой цвет или заполнена символом.

Подумайте о том, как вы ожидаете, что выход будет искать эти случаи:

Пустая строка ? Строки, заполненные только пробелами? Строки только с одним космосом ? С одной вкладкой? С одним космосом и одной вкладкой? С одной вкладкой и одним космосом? Да, они все выглядят по-разному !

Или вы хотите, чтобы пустая строка выглядела как - просто пустая строка ?
Если это так, вы не хотите окрашивать выходные потоки, на самом деле, и этот ответ применим .


Я приведу аналогичный подход к решению @ StéphaneChazelas, но «обратный»:

Вы можете , технически, цвет STDOUT и STDERR, строка за строкой , с добавлением правильных кодов побега к началу и концу строки в обоих потоках.

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

Но: Вы контролируете все остальные цвета, верно?
И вам нужен только один цвет? Отлично!

Установите цвет клемм по умолчанию на STDOUT/STDERR, а остальные - как вы предпочитаете.

Можно раскрасить подсказку оболочки и использовать код подсказки для раскрашивания других деталей.
Конечно, несколько сложно раскрасить командную строку , где вы редактируете свою команду, но это вполне возможно. Но не пытайтесь это с bash , если вы можете использовать zsh , так как код обработки подсказки это гораздо более гибко там - это то, что вам понадобится.

Теперь установите для клемм цвет переднего плана по умолчанию серый и, возможно, фоновый - но постарайтесь оставить его прозрачным/неопределенным.

Чтобы задать цвет фона командной строки, просмотрите этот пример из Изменить цвет фона командной строки в zsh при изменении темы приглашения :

PROMPT="%{$bg[cyan]%}%{$fg[red]%}%n%{$reset_color%}%{$bg[cyan]%}@%{$fg[red]%}%m %{$fg[yellow]%}%~ %{$reset_color%}%{$bg[cyan]%}%% "

shell prompt example

(Жесткая часть получает неиспользуемые концевые разделы строк в различных ситуациях правильно.)

1
27.01.2020, 20:15

Теги

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