Обновить
5

Пользователь

Отправить сообщение

Вроде бы, в английском есть generic you, который очень хорошо соответствует русскому "ты", который, как раз, тоже безликий, но более разговорный. Типа "и ты такой сидишь задумчивый".

Есть такой мысленный эксперимент ...

... мыслительный эксперимент ...

С самого начала статьи разброд в терминах. Первое верно, второе - лишено смысла.

Вот это красивше будет:

while read -r enable command ; do
    case "$command" in
    enable | logout | exit | echo ) ;;
    * ) enable -n "$command" ;;
    esac
done <<<"$( enable )"

Но еще проще писать и читать в родных идиомах языка, например:

eval "$( enable | sed '/ \(enable\|logout\|exit\|echo\)$/! s/ / -n /' )"

Интересно, как отработает следующая команда? И аналогичные ей.

command ls.old /
scripts/check_shellcheck.sh
shell/check_shellcheck.sh

В первом shellcheck хорошо живет без докера, а во втором зачем-то понадобился. Значит можно объединить в один и вызывать с аргументами командной строки.

*.sh
*_in_docker.sh

Практически идентичные скрипты. Кардинальное отличие, что вторые запускают что-то внутри докера, ну и небольшие отличия по коду, которые не делают скрипты существенно тличными друг от друга.

Я бы все это богатство завернул в один скрипт с поддержкой аргументов, который с помощью getopts перебирал бы параметры, потом подготавливал скрипт к основной работе, а там уже выполнял бы всю основную работу.

При необходомости проверки с другой логикой - в отдельные вспомогательные скрипты. И добавить обвязку вокруг этого скрипта как основного.

Несколько замечаний при беглом просмотре ваших скриптов.

  1. Несколько скриптов проверки форматов суть один скрипт - просто сравнитеcheck_{css,html,markdown,yaml}lint.sh

  2. Логичнее вначале проверить существование файла, затем соответствие каким-то требованиям (например, расширение)

  3. Разнородные проверки одного и того же (конкретно: соответствие расширению). В одном месте [[ ! "$file" =~ .md$ ]] , в другом - [[ "${FILE##*.}" != "sh" ]].

  4. В случае ошибок показать список "неправильных" файлов было бы хорошей подсказкой для последующего исправления

  5. Привязка к докеру, как будто без него работать не будет

например клеенный переплет

Без шампуров аккуратнее будет )))

Первый вариант

  1. Аккуратно снять обложку вместе с корешком

  2. Просверлить, как у вас, но без обложки

  3. Потом пропустить суровую нитку через отверстия туда-сюда, затянуть концы и связать (они будут торчать с одной стороны из двух соседних отверстий, поэтому проблем не будет)

  4. Приклеить обложку

Другой вариант

  1. Аккуратно снять обложку вместе с корешком

  2. Закрепить книжный блок и сделать равномерно пропилы на глубину примерно 3-5 мм

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

  4. Отрезать излишки ниток, торчащих из пропилов

  5. Приклеить обложку

Первый вариант крепче, но книгу будет не очень удобно читать (особенно толстую). Второй - чуть менее прочный, но вполне долговечный.

Второй вариант, кстати, упоминается в самом первом комментарии.

Озарения из прошлого, когда паскаль использовал: помню, что объявления переменных шли всегда вначале, отдельным блоком. Сейчас, наверно, уже можно смешивать в си-подобном стиле.

А у вас молоко убежало...

procedure bubble(a: array of Integer);
begin
  var n := Length(a);
  var i := 0;

К сожалению у них ничего не получится. Уже давно очень, жарким летом 1972-го, один астрофизик из Ленинграда разрабатывал фундаментальное исследование структур звездных скоплений. Но сама вселенная воспротивилась его продвижению в работе. Пришлось остановиться.

Кстати - да. Стек и очередь - две структуры данных (точнее - типа данных), реализующих разный способ извлечения элементов. Правильнее было бы назвать массивами или списками.

Здесь в комментариях-описаниях неверно изложена логика. Начиная со строк 4 и 5 некорректно отражены действия и состояния стека.

                     #              stack=()
<a>                  # push a;      stack=(a)
    <b>              # push b;      stack=(a b)
        <c>meow</c>  # push c;      stack=(a b c)
        <d>nya</d>   # pop; push d; stack=(a b d)
    </b>             # pop;         stack=(a b)
</a>                 # pop;         stack=(a)
                     # pop;         stack=()

Логичнее было бы так: каждому <tag> соответствует свой push tag , и каждому </tag> соответствует свой pop. Тогда состояние стека, выражаемое stack=(...), точно соотвествовало бы действиям.

                     #              stack=()
<a>                  # push a;      stack=(a)
    <b>              # push b;      stack=(a b)
        <c>meow</c>  # push c; pop; stack=(a b c) stack=(a b)
        <d>nya</d>   # push d; pop; stack=(a b d) stack=(a b)
    </b>             # pop;         stack=(a)
</a>                 # pop;         stack=()

В одной из сцен на агента Илью Курякина нападают два робота. Они методично стреляют в него ракетами, а герой отбивается крышкой от мусорного бака. Для современного зрителя сцена может показаться комичной, но для своего времени это был серьезный экшн.

Да ладно! Самая что ни на есть современная сцена - только представьте на их месте каких-нибудь роботов-доставщиков.

радиус порядка 1—5 ферми, что составляет миллионные доли нанометра

Как сложно-то для читателя. "Милионная" это 6, "нано" - 9, потом сложить. Не проще было бы сказать сразу про 10^-15 м? Или сказать, что сравнимо с размерами атомных ядер, что составляет порядка 10^-15 м?

print_and_execute

Сомнительно. Чем вам пара set -x/set +x не угодила? И название длинное.

xtrace() {
	set -x
	"$@"
	set +x
}

Конечно же будет выводится лишняя отладочная строка + set +x. Но это мелочи. Зато можно так писать, а отладку включать/выключать комметированием первой строки:

xtrace \
какая-то команда с кучей --разных --ключей и разных параметров

Разве этот код не вылетает по переполнению стека?

check_idle_time() {
    ...
    check_idle_time
}

check_idle_time

По п5. Все верно. Редактируете /etc/apt/sources.list и /etc/apt/sources.list.d/* - пишете туда все, что вам требуется, а потом apt update ; apt dist-upgrade -y ; apt install все что надо для счастья . Или вендор рекомендует другой путь?

Несколько замечаний

1.

#Получение короткого имени hostname
hostnamectl set-hostname DC_NAME.DOMAIN_NAME

В первом листинге: коммент не соответствует действию

2.

$IPADDR $SERVER_NAME.DOMAIN_NAME $PC_NAME

Во втором листинге используется необъявленная переменная PC_NAME

3.

ALDPRO_CHECK=`dpkg -l | grep aldpro-client`
if [[ -z $ALDPRO_CHECK ]];

это можно упростить до

if ! dpkg -l aldpro-client >/dev/null 2>&1

4.

-d "{
"data": {

Чтобы не мучиться с экранированием кавычек в кавычках, лучше вызватьcat в субшелле, например:

-d "$(
  cat - <<-DATA
  {
    "data": {
    ...
DATA
)"

5.

обновление ОС - первый скрипт

#Обновление ОС до актуальной версии
apt update -y
apt install astra-update -y && sudo astra-update -A -r -T

обновление ОС - второй скрипт

#Установка пакетов ALD Pro
apt update -y
DEBIAN_FRONTEND=noninteractive apt-get install -q -y aldpro-client

Получается на второй машине почему-то игнорируется обновление системы. И вообще в целом, обновление репозиториев выстроено нелогично. Лучше прописать все источники в sources.list и//или sources.list.d/, а потом выполнить обновления репо, системы и установку нужных пакетов.

Дальше уже читал по диагонали.

А вот &> — маст‑хэв для тех, кто хочет всё в одном флаконе: и stdout, и stderr вместе.

Спорное утверждение. Почему оно именно мастхэв? Чем оно лучше явных1>FILE 2>FILE или >FILE 2>&1 кроме того, что &> это нововведение баша и просто более короткий вариант?

Тогда уж вкупе с этим неплохо было бы рассказать и про башевский массив PIPESTATUS. Хоть статья и рассказывает о потоках, но примеры все башевские. В других шеллах эти примеры могут и не сработать.

1
23 ...

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность