Получите последний исходный код через apt-get source network-manager
, получите соответствующие пакеты с помощью apt-get build-dep network-manager
, затем соберите пакет самостоятельно с помощью dpkg-buildpackage
. Затем вы можете установить файл.deb вручную.
Вы можете подключиться к cat -v
, чтобы увидеть все символы этого файлового потока. column
вычисляет ширину, используя их:
^[[1mfoo^[(B^[[m ^[[1mbar^[(B^[[m
bar foo
Правильный способ — отделить любое создание контента от любого форматирования (, как в модели MVC ). Обратите внимание, что column
добавляет пробелы для создания вкладки -, аналогичной выводу, поэтому он изменяет содержимое. В то время как tput
добавляет инструкции к терминалу. Разделив эти задачи, мы можем сохранить вывод в файл или передать его из нашей функции форматирования для отправки на консоль или отформатировать для другого назначения.
Но это также хорошее упражнение для awk
для реализации column -t
, исключающей некоторые символы из вычислений ширины.Регулярное выражение, которое я использую ниже, улавливает много вещей tput
, но я почти уверен, что не все.
$ cat tst.awk
BEGIN {
OFS = " "
}
{
nr = NR
for (i=1;i<=NF;i++) {
f[NR,i] = $i
gsub(/\x1B[^[:alpha:]]+[[:alpha:]]/,"",$i)
if (length($i) > col[i]) col[i] = length($i)
}
}
END {
for (i=1;i<=nr;i++) {
for (j=1;j<=length(col);j++) {
printf "%-"col[j]"s%s", f[i,j], (j==length(col)? ORS : OFS)
}
}
}
и вы передаете первый вывод наawk -f tst.awk
$ { echo -e "$(tput bold)foo$(tput sgr0)" "$(tput bold)bar$(tput sgr0) baz"; echo bar foo; } |cat -v ^[[1mfoo^[(B^[[m ^[[1mbar^[(B^[[m baz bar foo
Проблема заключается в tput sgr0
, который, как вы знаете, по умолчанию tputs
использует escape-коды, основанные на типе терминала, взятом из переменной окружения TERM
.
если да:
infocmp -1 |grep -E 'bold|sgr0'
bold=\E[1m,
sgr0=\E(B\E[m,
Вы увидите, что жирный и sgr0 коды являются (не являются -экранированными значениями ANSI ), которые, как вы видите в выводе после cat -v
те преобразуется в ^[[1m
для tputs bold
и ^[(B^[[m
для sgr0
и column
команда делает то же самое и разрешается в коды escape-типа ANSI, но терпит неудачу, когда есть (B
и остается в ^[(B^[[m
, а затем это не не распознается в escape-последовательности ANSI и приводит к тому, что окончательный вывод не соответствует ожидаемому столбцу -правильно.
если да:
infocmp -1 -T ansi |grep -E 'bold|sgr0'
bold=\E[1m,
sgr0=\E[0;10m,
вы найдете эквивалентные escape-коды ANSI для каждого; так что у вас есть два варианта решения:
Замените tputs
управляющими кодами ANSI выше
{
echo -e "\033[1mfoo\033[0;10m" "\033[1mbar\033[0;10m baz";
echo bar foo;
} |column -t
Передать Тип терминала наtputs
:
{
echo -e "$(tput bold)foo$(tput -T ansi sgr0)" "$(tput bold)bar$(tput -T ansi sgr0) baz";
echo bar foo;
} |column -t