Как стать автором
Обновить
4
0

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

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

Искра-1256 нашлась в поиске. Сам не сразу вспомнил, как она звалась. Я на такой фортран мучил и какой-то странный фортрано-подобный язык по названием "символьно-скобочный язык".

Нууу...

Первое задание. Можно было бы решить проще:

select *
from #Movements
where EventCode <> 'EMI'
or EventCode = 'EMI'
and CreateDate = (
  select min(CreateDate)
  from #Movements
  where EventCode = 'EMI'
)

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

В целом: на супер-пупер сборник задач не тянет, но порешать можно.

Команда ls по умолчанию сортирует результат своего выполнения. Вероятно, сортировка производится в памяти. Однажды я столкнулся с проблемой падения ls * на нескольких десятках тысяч файлов. В таких случаях ls -U или find спасают ситуацию.

Есть переменная $PATH, которая содержит список путей, где искать файлы на исполнение. Например:

PATH=/bin:/usr/bin:/usr/local/bin

Когда в командой строке пишете что-то вроде:

$ какая-то-команда с какими-то ключами

то оболочка (bash, sh, zsh или, прости господи, cmd) ищет файл, перебирая все пути из переменной $PATH. То есть оболочка ищет исполнимый файл, один из:

/bin/какая-то-команда
/usr/bin/какая-то-команда
/usr/local/bin/какая-то-команда

Как только будет найден файл для запуска (исполнения), поиск прекращается и вызывается команда с параметрами, например:

/какой/то/путь/какая-то-команда с какими-то ключами

Если вы явно описываете путь

./какая-то-команда с какими-то ключами

то поиск не производится, а делается попытка запустить такую команду.

Здесь описана упрощенная схема. Здесь не описаны особые случаи для псевдонимов (alias), функций, которые обрабатываются в первую очередь. Также не сказано про очень особый случай с cmd.exe, который а) дополнительно смотрит на расширение файла (сравнивает с переменной %PATHEXT%, ищет ассоциации по расширению, выполняет еще какие-то магические действия), б) игнорирует переменную %PATH%, если в текущем каталоге имеется исполнимый файл с таким именем и в) некоторые его подводные камни.

Нууу. Сильный акцент, часто повторяющиеся слова, быстрая речь, но очень живая - он не монотонно долбит, как перфоратор, но использует интонацию. Конечно, очень широкую улыбку вызывает. Но речь-то очень и очень грамотная. Аригатин?

Забыл сказать. Хранить временные файлы в текущем каталоге - не есть хорошо. Если вы рут, то вы просто засоряете ФС. Если рядовой - у вас может не быть прав на текущий каталог и результат вашего скрипта - не предсказуем.

Почему это важно. Скрипт можно завершить разными способами: клавишами CTRL-C, командой kill. В результате - команды rm FILE в конце скрипта могут быть и не выполнены. А в ФС вы оставите следы выполнения скрипта в произвольном месте.

Лучшее решение для этого (но этого не гарантирует от полной очистки ФС и, тем более, от авадакедавры типа kill -9) - в начале скрипта описать что-то вида:

# Какой-то временный файл, который нужен только на время выполнения скрипта
# $$ - PID текущего процесса в имени файла, обеспечивает уникальность файла
TMPFILE="${TMP:-/tmp}/certmgr-list-$$.out"

# ловушка - код, который будет выполнен по выходу (`EXIT`) из скрипта
# может быть внешней или внутренней командой или шелл-функцией
trap 'rm -f "$TMPFILE"' EXIT

И вам уже не надо писать отдельные команды для удаления временных файлов.

предложениям по оптимизации bash скрипта

1

Сразу скажу, что #!/bin/sh и конструкции вида [[ ... ]] или (( ... <= ... )) (которые назыаются башизмами) - несовместимые вещи. Такой шебанг в начале скрипта предполагает, что это будет классифеский шелл, который не поддерживает удобные, расширенные возможности баша.

Поэтому: или #!/usr/bin/env bash и используйте всю мощь баша или откажитесь от башизмов.

2

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

3

Надо оптимизировать скрипт: я насчитал 5 вызовов команды certmgr -list. При этом в трех местах используется grep -E "Subject ". Понятно, что в каждый момент вы собираете разную информацию, но это очень не рационально.

4

Ваш скрипт построен по принципу

команда1 > FILE
команда2 >> FILE
cat FILE

Вероятно нет смысла вначале все сохранять в файл, а потом этот файл выводить. надо сразу писать в STDOUT. Если промежуточный результат надо еще как-то дополнительноо обработать, то можно сделать примерно так:

что-то-писать() {
	команда1
	команда2
}

что-то-писать | как-то-обрабатывать

5

Простите, но cat FILE | tail -n $COUNTER | head -n 1 - это ужасно. Определенно, требуется оптимизация в части пунктов 3 и 4.

Я понимаю, что оно уже работает и чего его трогать. Но неоптимально написанный код в будущем порождает "неоптимальную оптимизацию".

6. Резюме

Я не знаю, как работает certmgr и каков его выхлоп, но смею предположить, что однократный вызов certmgr -list | grep -e 'Subject ' -e 'Not valid after' > "$TMP/certmgr-$$.out" уже будет существенной оптимизацией. А дальше работать с файлом "$TMP/certmgr-$$.out".

Выразительных средств awk/perl будет достаточно, чтобы оптимизировать скрипт, поддерживать его в дальнейшем и даже, при необходимости, с легкостью улучшать.

люди задействовали два самых важных канала для общения – зрение и слух

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

Вот еще... Целая игровая площадка с разными песочницами

https://onecompiler.com

Вот так выглядят простейшие арифметические действия

Это на простейших примерах. А вот V + W = Г (2 + 4 = 6, записанное с помощью более-менее похожих символов). И здесь надо учитывать "внутренний перенос разряда" при переходе между 4 и 5.

Наверно, при сложении 5 вертикальных преобразовать в 1 горизонтальную. Как в подобных случаях с другими операциями еще не сообразил.

А вот, например, как 3 + 18 = 21? Наверно, дело привычки. 6 вертикальных это 1 горизонтальная и 1 вертикальная, получается 4 горизонтальных и 1 вертикальная. А 4 горизонтальных это 1 вертикальная рядом (новый разряд).

прослушивание коротких <...> намного эффективнее для обучения, чем просмотр кинофильмов или сериалов.

прокачивать свой английский на основе прослушивания песен <...> - лучше не делайте этого.

Ну наконец-то хотя бы еще один выражает схожее с моим мнение. Помнится, учителя одной школы советовали, и говорящие головы другой популярной обучающей платформы, нет-нет, да и посоветуют тоже слушать любимые песни и смотреть любимые сериалы. И в качестве "хорошего" примера предлагают сериал "Друзья". А я его и в переводе-то смотреть не хочу - у каждого свои фломастеры.

На самом деле, рекомендуют, все-таки, [ foo ] || [ bar ] вместо [ foo -o bar ].
Например, http://www.oilshell.org/blog/2017/08/31.html

Нет. Не выругается и не завершится с ошибкой. Единственное, что я поправил бы в своем предыдущем ответе - переписать в виде ${var:+$var:} - выполнить подстановку, если переменная существует и не пустая строка (в отличие от первого варианта, который подразумевает только проверку на существование переменной).

Глубоко не всматривался, но сразу бросилось в газа - красивые, строго структурированные строки.

Можно заменить строки вида

if [ -z "${var-}" ]
then
    export var="..."
else
    export var="$var:..."
fi

на следующую

export var="${var+$var:}..."

А еще есть historical present, "историческое настоящее". Это когда

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

Берите все сейчас, а то еще накидаю вариантов на чистом шелле, без внешних команд )))

Я тут еще немного поупражнялся: улучшил команды, так чтобы одинаковый набор и без цикла для второй переменной:

для ETCD_SERVERS:

seq 0 $(( MASTER_COUNT-1 )) \
| awk -v fmt="https://master-%s.$BASE_CLUSTER_DOMAIN:$ETCD_SERVER_PORT" \
'{ s && s = s "," ; s = s sprintf(fmt, $0) } END { print s }'

для ETCD_INITIAL_CLUSTER:

seq 0 $(( MASTER_COUNT-1 )) \
| awk -v fmt="master-%s.$BASE_CLUSTER_DOMAIN=https://master-%s.$BASE_CLUSTER_DOMAIN:$ETCD_PEER_PORT" \
'{ s && s = s "," ; s = s sprintf(fmt, $0, $0) } END { print s }'

Можно было бы еще, но я думаю - хватит.

Что-то как-то очень сложно переменную ETCD_SERVERS создаете: первый sed безполезный, а еще и двойной echo (первый - в цикле в субшелле, потом внешний). Попробуйте вот это - у него приятный вкус:

printf ",https://master-%s.$BASE_CLUSTER_DOMAIN:$ETCD_SERVER_PORT" \
	$( seq 0 $(( MASTER_COUNT-1 )) ) \
| sed 's/,//'

Вот еще один деликатес - для ETCD_INITIAL_CLUSTER:

for n in $( seq 0 $(( MASTER_COUNT-1 )) )
do
	n="$n.$BASE_CLUSTER_DOMAIN"
	printf ",master-%s=https://master-%s:$ETCD_PEER_PORT" $n $n
done \
| sed 's/,//'

Думается мне - кровушки попили они с вас, пока не пришли к нужному виду.

эволюционировали вместе с нами

Биом, обитающий внутри нас - штука приобретаемая нами после рождения: мы не рождаемся с ним, он попадает в нас позже. Как биом эволюционирует и где он выживает до того как в нас попасть?

В скрипте опечатка в имени переменной: SourcekDir (одно объявление и одно использование). В тексте статьи упоминается верно: SourceDir.

1
23 ...

Информация

В рейтинге
4 345-й
Зарегистрирован
Активность