Я не знаю если приложение "автоматизировать" обслуживание crontab. То, что я делаю, является содержанием 'основной' crontab, отредактируйте это, затем используйте crontab ~/etc/app.cron
или что-то подобное. Затем это было бы достаточно легкий создать что-то для автоматизации модификации ~/etc/app.cron.
Для именованных заданий, как Вы хотите, необходимо будет или создать мини-базу данных с именами задания или добавить имя задания к структурированному комментарию в конце crontab строки.
Как Ваша хижина и синтаксис указывает непортативный bash
, Я предпочитаю его этот путь:
function box_out()
{
local s="$*"
tput setaf 3
echo " -${s//?/-}-
| ${s//?/ } |
| $(tput setaf 4)$s$(tput setaf 3) |
| ${s//?/ } |
-${s//?/-}-"
tput sgr 0
}
Конечно, можно оптимизировать его, если Вы желаете.
Обновление согласно просьбе в комментарии, для обработки многострочного текста также.
function box_out()
{
local s=("$@") b w
for l in "${s[@]}"; do
((w<${#l})) && { b="$l"; w="${#l}"; }
done
tput setaf 3
echo " -${b//?/-}-
| ${b//?/ } |"
for l in "${s[@]}"; do
printf '| %s%*s%s |\n' "$(tput setaf 4)" "-$w" "$l" "$(tput setaf 3)"
done
echo "| ${b//?/ } |
-${b//?/-}-"
tput sgr 0
}
Назовите его с несколькими параметрами, как box_out 'first line' 'more line' 'even more line'
.
Итак, мое решение не совсем такое же, как ваше, но, строго говоря, оно печатает рамку вокруг текста, и реализация немного проще, поэтому я решил поделиться.
banner() {
msg="# $* #"
edge=$(echo "$msg" | sed 's/./#/g')
echo "$edge"
echo "$msg"
echo "$edge"
}
И вот он в действии:
$ banner "hi"
######
# hi #
######
$ banner "hi there"
############
# hi there #
############
Просто обычный текст, никаких причудливых цветов ansi или чего-то еще.
$ echo 'Love Unix & Linux' | boxes -d stone -p a2v1
+---------------------+
| |
| Love Unix & Linux |
| |
+---------------------+
Поскольку boxes
требует, чтобы текст был отправлен в виде файла, я рекомендую использовать синтаксис в приведенном выше примере, где текст передается в boxes
–echo
.
boxes
?" Пользоваться им легко. Просто скажите, какой дизайн границы вы хотите использовать и как вы хотите, чтобы он выглядел, и все готово.
Конечно, если вы хотите проявить творческий подход, вы можете создать свой собственный дизайн. Это действительно легко и весело делать. Единственным недостатком использования boxes
является то, что я не понял, как центрировать поле, сгенерированное с помощью boxes
, чтобы выровнять центр по экрану, хотя для этого есть лайфхак
Первоначальный вопрос продемонстрировал использование цветовых кодов. Поэтому кажется правильным показать, как boxes
справится с этим.
Несмотря на то, что tput
популярен, я считаю себя приверженцем старой школы Bash и до сих пор люблю использовать escape-команды. Я уверен, что на StackExchange есть несколько человек, которые будут возражать против этого, но каждому свое. Как бы то ни было, я готов отложить в сторону свое личное предпочтение сделать это, чтобы включить еще один пример, делающий это способом tput
.
Естественно, я думаю, что первым шагом будет установка цвета внутреннего текста. Итак, давайте сделаем это в первую очередь.
printf "$(tput setaf 4)Love Unix & Linux$(tput sgr 0)" | boxes -d stone -p a2v1
+---------------------------------+
| |
| Love Unix & Linux |
| |
+---------------------------------+
Если бы это было в терминале, Love Unix & Linux
был бы синим... однако, как вы можете видеть, boxes
не справился с этим хорошо. Так что же не так?
printf "$(tput setaf 4)Love Unix & Linux$(tput sgr 0)" | boxes -d stone -p a2v1 | cat -A
+---------------------------------+$
| |$
| ^[[34mLove Unix & Linux^[(B^[[0m |$
| |$
+---------------------------------+$
Более внимательное рассмотрение путем отображения скрытых символов с помощью cat -A
показывает, что boxes
предполагает, что длина блока включает длину текста И escape-символы.
Однако следует отметить, что если вы используете программу, подобную lolcat
, вне из boxes
, вывод будет выглядеть следующим образом
$ echo 'Love Unix & Linux' | boxes -d stone -p a2v1 | lolcat -f
+---------------------+
| |
| Love Unix & Linux |
| |
+---------------------+
но с рамкой и текстом в цветах радуги.
Хорошо, что я еще не сделал свои собственные бордюры с цветовыми кодами,как я полагаю, дизайн границ будет подвержен тем же проблемам.
Другой недостаток Разобрался. boxes
заключается в том, что если вы знаете, как использовать Bash для центрирования текста по краю терминала, boxes
все равно будет выравнивать поле по левому краю экрана.
Если вы хотите центрировать текст, который не находится в рамке, вы можете просто использовать
center(){
COLS=$(tput cols) # use the current width of the terminal.
printf "%*s\n" "$(((${#1}+${COLS})/2))" "$1"
}
И используйте это, чтобы центрировать одну строку текста.
center 'Love Unix & Linux'
Для изображений ascii -, где используется несколько строк и их необходимо зафиксировать на месте, существует эта опция.
# Rather than removing text, even things out by padding lines with spaces
draw_banner(){
local banner="$1"
# Banner Width
BW=$(cat $banner | awk '{print length}' | sort -nr | head -1)
while IFS= read -r line; do
line=$(echo "${line}" | sed -n -e 's/^ / /g;p')
line=$(printf "%-${BW}s" "${line}")
center "${line}" # our center function from earlier.
done < "$banner"
}
draw_banner "path/to/your_ascii_art_logo.txt"
Но если вам нравится использовать такие вещи, как figlet
, вам не нужно использовать эти функции, так как опция -c
предоставляет возможность центрировать.
$figfontdir="path/to/figlet/fonts"
$figfont="Alligator"
text_banner(){
COLS=$(tput cols) # use the width of the terminal!
figlet -d "$figfontdir" -f "$figfont" -k -w $COLS -c "$1"
}
text_banner 'Love Unix & Linux'
Для boxes
мы делаем что-то похожее на draw_banner()
, но нам нужно передать данные!
# Center a box created with `boxes
# It's like draw_banner, but `<<<` reads a string of data rather than a file.
$boxfile="/path/to/your_box_designs.box" # or ".txt". I like ".box".
$boxdesgin="stone"
center_box(){
local data="$(</dev/stdin)" # Read from standard input
# Banner Width
BW=$(cat <<< ${data} | awk '{print length}' | sort -nr | head -1)
while IFS= read -r line; do
line=$(echo "${line}" | sed -n -e 's/^ / /g;p')
line=$(printf "%-${BW}s" "${line}")
center "${line}" # our center command from earlier.
done <<< "${data}"
}
(
# A bunch of stuff to center!
) | boxes -f $boxfile -d $boxdesign -a hcvcjc | center_box
Устранение обеих этих проблем проблемы с символами UTF/ANSI не только сделало бы boxes
лучшее решение для инкапсуляции текста в поле ASCII, но и позволило бы использовать творческую альтернативу, которую можно было бы использовать вместо этого. ручных -кодировочных ящиков.
Взял комментарий @robru и немного улучшил его, чтобы разрешить многострочный текст.
function PP () {
local longest=0
local string_array=("${@}")
for i in "${string_array[@]}"; do
if [[ "${#i}" -gt "${longest}" ]]; then
local longest=${#i}
local longest_line="${i}" # Longest line
fi
done
local edge=$(echo "$longest_line" | sed 's/./#/g' | sed 's/^#/###/' | sed 's/#$/###/')
local middle_edge=$(echo "$longest_line" | sed 's/./\ /g' | sed 's/^\ /#\ /' | sed 's/\ $/\ \ #/')
echo -e "\n${edge}"
echo "${middle_edge}"
for i in "${string_array[@]}"; do
local length_i=${#i}
local length_ll="${#longest_line}"
if [[ "${length_i}" -lt "${length_ll}" ]]; then
printf "# "
local remaining_spaces=$((length_ll-length_l))
printf "${i}"
while [[ ${remaining_spaces} -gt ${#i} ]]; do
printf " "
local remaining_spaces=$((remaining_spaces-1))
done
printf " #\n"
else
echo "# ${i} #"
fi
done
echo "${middle_edge}"
echo -e "${edge}\n"
}
Итак, Если написать PP "Hi." "I'm Here" "Nice to meet you......"
Вы получите следующее:
##########################
# #
# Hi. #
# I'm Here #
# Nice to meet you...... #
# #
##########################
\n
ввести CRS? – TryTryAgain 02.06.2016, 20:48bash
, право? – manatwork 03.06.2016, 10:20${s[@]}
– все элементы массива s;((w<${#l}))
–((
..))
окружите тестирование арифметики, является ли значение переменного w меньше, чем переменная l длина значения, полученная с расширением параметра (#
– длина строки);${b//?/-}
– расширение параметра, заменяющее все случаи любого символа с “-” (//
– замените все;?
– подстановочный знак, означающий любой символ). – manatwork 07.04.2018, 20:31