Команда CMake cmake_policy()
описана в документации CMake .
Обычно он добавляется в файл CMakeLists.txt
проекта, чтобы изменить поведение самого CMake, обычно для того, чтобы иметь возможность обрабатывать старые CMakeLists.txt
функции с более новыми версиями CMake.
Вы можете использовать его для установки отдельной политики, используя
cmake_policy(SET CMP OLD)
где
— номер политики CMake, а OLD
указывает, что вы хотите «старое поведение» этой политики (слово OLD
также может бытьNEW
).
Или вы можете использовать команду для установки политик совместимости с определенной версией CMake, используя
cmake_policy(VERSION x.xx)
где x.xx
должно быть как минимум 2.4
.
В любом случае CMakeLists.txt
файл проекта будет изменен, и cmake
придется повторно -запустить.
См. также документацию поcmake_minimum_required()
.
Сzsh
:
printf '%s\n' ${(l[20][@])}
(с помощью l
левого -заполнения флага расширения параметра . Вы также можете использовать r
ight padding здесь ).
Конечно, вам не обязательно использовать printf
. Вы также можете использовать print
или echo
, которые добавляют \n
по умолчанию.(printf '%s\n' "$string"
можно записать print -r -- "$string"
или echo -E - "$string"
в zsh
, но если $string
не содержит обратной косой черты и не начинается с -
, это можно упростить до print "$string"
/echo "$string"
).
Если конечная -цель состоит в том, чтобы отобразить список строк, дополненных до ширины экрана, вы должны сделать:
$ lines=(short 'longer text' 'even longer')
$ print -rC1 -- ${(ml[$COLUMNS][@][ ])lines}
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ short
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ longer text
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ even longer
$ print -rC1 -- ${(mr[$COLUMNS][@][ ])lines}
short @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
longer text @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
even longer @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Где флаг m
заставляет zsh учитывать ширину отображения каждого символа (, например, для тех символов двойной ширины -выше (, которые ваш браузер может не отображать с точно двойной шириной -, но ваш терминал должен )).
print -rC1 --
аналогично printf '%s\n'
или print -rl --
для печати одного элемента в строке, за исключением случая, когда ему не передаются никакие аргументы (например, когдаlines=()
)и в этом случае он ничего не печатает вместо пустой строки ).
printf %.1s @{1..20} $'\n'
Оболочка сначала расширяет фигурные скобки, это называется «Расширение фигурной скобки». @{1..20}
в @1 @2 @3...
и так далее
Затем будет выведен первый байт каждого параметра, включая последний аргумент $'\n'
, состоящий из одного байта -символ новой строки
Версия, которая будет печатать столько, сколько вы хотите (ограничение размера строки оболочки не срабатывает, если у вас есть, скажем, 1000000 чисел для печати):
seq 1 $n | xargs printf '@%.0s'
printf '\n'
примечание:если вы добавите -p к xargs (xargs -p...):он подсказывает каждый раз, когда хочет запустить команду, таким образом, он показывает, что он втискивает столько аргументов после printf, как может, поэтому он запускает всего несколько printf, а не 1 на каждый аргумент! (вот и вся цель xargs)
если вы просто хотите сгенерировать произвольную длинную строку @:
yes "@" | head -n "$n" | tr -d '\n'
printf '\n'
просто вызывает yes и tr один раз и должно быть довольно быстрым
В других ответах использовались расширения стандартного синтаксиса оболочки, которые доступны в определенных оболочках, таких как оболочки Korn, Z и Bourne Again. В этом нет ничего плохого, но есть альтернативный подход.
Можно воспользоваться тем фактом, что (и )видеотерминалы не являются "тупыми" и никогда ими не были; и (b )в настоящее время, в третьем десятилетии 21-го века, большинство видеотерминалов и даже их эмуляторов , в значительной степени сходятся в понимании ECMA -48, а не системы управления последовательностью их.
ECMA -48, начиная с его первых дней в 1970-х годах, определил управляющую последовательность REP, которая является CSI, параметром и b
в качестве конечного символа. Это повторяет предыдущий графический символ, напечатанный (, среди прочего, который я не буду здесь рассматривать, поскольку нас интересуют только графические символы ).
Эмуляторам терминалов потребовалось некоторое время, чтобы догнать настоящие терминалы. В то время как устройства серии DEC VT5xx в 1990-х понимали REP, только в последнее десятилетие он стал обычным явлением в эмуляторах терминалов. XTerm намного опередил большинство и понял это с 1996 года, но libVTE и KDE Konsole не догнали его до 2017 и 2018 годов.
Таким образом, пока ваш реальный видеотерминал или эмулятор терминала понимает то, что было стандартизировано в 1970-х годах, и вы не используете бумажный терминал (, что крайне маловероятно ),печать @
20 раз может быть выполнена с без оболочки -специального синтаксиса, без конвейеров команд, без подстановок или редактирования потока, и простоprintf
:
printf '@\033[%db\n' 19]
Это работает практически со всеми оболочками, даже с оболочкой Debian Almquist.
Вы можете проверить базу данных termcap/terminfo на наличие возможности repeat_char
/ rep
, чтобы определить, поддерживает ли тип терминала REP. (Применяются обычные предостережения. :Некоторые старые реальные терминалы реагируют на управляющие последовательности, отличные от -ECMA -48, и tput rp
в общем случае является лучшим подходом, чем printf
, хотя не -ECMA -48 случай на практике весьма маловероятен; вы должны проверить правильный тип терминала, который соответствует вашему терминалу, а не просто ошибочно предположить "О, это xterm
."; и ваша база данных terminfo/termcap должна быть обновлена с -до -.)
Тем не менее, удивительно, что мир, в котором есть banner
, figlet
, boxes
и cowsay
, не создал и не распространил простую утилиту, которая могла бы испускать различные стили горизонтального правила во всех эти годы. Представь:
hr -c @ -n 20
Один printf
, заканчивается новой строкой, переменный размер, работает с тире, ksh, bash и zsh:
$ printf '%*.0s\n' 33 "" | tr " " "@"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@