Strongbash
Различия
Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия Последняя версия Следующая версия справа и слева | ||
соглашения_кода:strongbash [09.04.2018 14:32] admin |
соглашения_кода:strongbash [02.12.2018 11:43] admin Approved(admin 2018/12/02 11:44) |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
===== Соглашение по строгому bash ===== | ===== Соглашение по строгому bash ===== | ||
+ | TODO_OSV возможно выборочно проверять номера из https://github.com/koalaman/shellcheck | ||
===== strongbash001 ===== | ===== strongbash001 ===== | ||
Строка 331: | Строка 332: | ||
exit 0 | exit 0 | ||
</code> | </code> | ||
- | <color #22b14c>Хорошо сделать функцию __exit(), если много exit 0 в программе</color> | + | <color #22b14c>Хорошо сделать функцию</color> <nowiki> |
+ | __exit()</nowiki><color #22b14c>, если много exit 0 в программе</color> | ||
<code bash> | <code bash> | ||
#!/bin/bash | #!/bin/bash | ||
Строка 479: | Строка 481: | ||
- Это усложняет чтение кода и понимание кода, файл сам по себе есть переменная и временная ссылка на него редко оправдана.\\ | - Это усложняет чтение кода и понимание кода, файл сам по себе есть переменная и временная ссылка на него редко оправдана.\\ | ||
- Плохо если приходится искать далеко вверху по коду, что это за переменная, и что там в этом файле.\\ | - Плохо если приходится искать далеко вверху по коду, что это за переменная, и что там в этом файле.\\ | ||
- | - mktemp это тоже плохо так как бессмысленно, если оч надо tt=/tmp/NAME_$((RANDOM)).$$\\ | + | - mktemp это тоже плохо так как бессмысленно, если оч надо <code bash> |
+ | tt=/tmp/NAME_$((RANDOM)).$$ | ||
+ | </code>\\ | ||
- Имя временного файла должно содержать в себе имя исполняемой программы и ее PID обязательно для разбора оставшихся после падения файлов.\\ | - Имя временного файла должно содержать в себе имя исполняемой программы и ее PID обязательно для разбора оставшихся после падения файлов.\\ | ||
- Если файлов останется от падения слишком много, то скрипт не сможет работать тк пиды заполнятся и это нормально мы об этом узнаем. Либо можно сделать rm -f перед работой | - Если файлов останется от падения слишком много, то скрипт не сможет работать тк пиды заполнятся и это нормально мы об этом узнаем. Либо можно сделать rm -f перед работой | ||
Строка 550: | Строка 554: | ||
Большая вложенность всегда приводит к большой вложенности мысли при чтении кода, это неудобно и приводит к ошибкам.\\ | Большая вложенность всегда приводит к большой вложенности мысли при чтении кода, это неудобно и приводит к ошибкам.\\ | ||
Используйте ранний return или сделайте подфункции, или case и тп.\\ | Используйте ранний return или сделайте подфункции, или case и тп.\\ | ||
- | Не используйте большие if then else и мозг будет занят 5-ю уровнями вложенности.\\ | + | Не используйте большие if then else иначе мозг будет занят 5-ю уровнями вложенности.\\ |
</hidden> | </hidden> | ||
Строка 590: | Строка 594: | ||
**Слишком большой линейный файл больше 64 строк, выделите подфункции.** | **Слишком большой линейный файл больше 64 строк, выделите подфункции.** | ||
<hidden Почему...> | <hidden Почему...> | ||
- | Если в файле больше 64 строк, значит однозначно есть команды которые делают похожие вещи и правильней их объединить в функции.\\ | + | Если в файле больше 64 строк, значит однозначно есть команды которые делают похожие вещи или группу вещей и правильней их объединить в функции.\\ |
</hidden> | </hidden> | ||
===== strongbash016 ===== | ===== strongbash016 ===== | ||
Строка 615: | Строка 619: | ||
echo "aaaaaaaaaaaaaaaaaaaaaa\ | echo "aaaaaaaaaaaaaaaaaaaaaa\ | ||
bbbbbbbbbbbbbbbbbbb" | bbbbbbbbbbbbbbbbbbb" | ||
+ | или | ||
+ | txt=\ | ||
+ | "aaaaaaaaaaaaaaaaaaaaaa | ||
+ | bbbbbbbbbbbbbbbbbbb" | ||
+ | или | ||
iptables -t nat -I xge_pre -m addrtype ! --dst-type LOCAL \ | iptables -t nat -I xge_pre -m addrtype ! --dst-type LOCAL \ | ||
-m set ! --match-set xge_auth_list src \ | -m set ! --match-set xge_auth_list src \ | ||
Строка 666: | Строка 674: | ||
1. Создание временного файла это своего рода with file и его удаление это end with, чтоб было понтяно где он более не нужен аля область работы с файлом. И если файл остался в тмп, то это признак что есть ошибка в логике. | 1. Создание временного файла это своего рода with file и его удаление это end with, чтоб было понтяно где он более не нужен аля область работы с файлом. И если файл остался в тмп, то это признак что есть ошибка в логике. | ||
- | 2. Использование trap EXIT тк он скрывает ошибки программ и никто о них не узнает, ломает честную логику алгоритма, это вредный хак. Должен быть явный вызов error_exit() и тп. | + | 2. Использование trap EXIT плохо тк он скрывает ошибки программ и никто о них не узнает, ломает честную логику алгоритма, это вредный хак. Должен быть явный вызов error_exit() и тп. |
Если нужно удалить lock можно использовать trap TERM INT HUP, если lock остался после сбоя значит он и должен остаться, чтобы получить ошибки и разобраться со сбоем.\\ | Если нужно удалить lock можно использовать trap TERM INT HUP, если lock остался после сбоя значит он и должен остаться, чтобы получить ошибки и разобраться со сбоем.\\ | ||
</hidden> | </hidden> | ||
Строка 679: | Строка 687: | ||
**2. А для чтения целой строки while <color #ed1c24>IFS=<nowiki>''</nowiki></color> read -r line; do**\\ | **2. А для чтения целой строки while <color #ed1c24>IFS=<nowiki>''</nowiki></color> read -r line; do**\\ | ||
<hidden Почему...> | <hidden Почему...> | ||
- | 1. read -r иначе все esc последовательности обработаются, это вряд ли Вы хотели.\\ | + | 1. read -r иначе все esc последовательности обработаются, это вряд ли то что Вы хотели.\\ |
2. IFS=<nowiki>''</nowiki> иначе начальные пробелы и табы потеряются и строка будет не та, что в оригинале.\\ | 2. IFS=<nowiki>''</nowiki> иначе начальные пробелы и табы потеряются и строка будет не та, что в оригинале.\\ | ||
</hidden> | </hidden> | ||
Строка 799: | Строка 807: | ||
===== strongbash029 ===== | ===== strongbash029 ===== | ||
- | **Если мы берем stdout от функции мы обязаны прописать в первой строке set -e тк он снимается** | + | **Если мы берем stdout от функции мы обязаны прописать в первой строке Функции set -e тк он снимается** |
- | ===== strongbash030 ===== | + | |
- | **Нельзя вызывать функцию внутри if fname и fname&& и fname||** | + | |
+ | |||
+ | ===== strongbash030 ===== | ||
+ | **Нельзя вызывать функцию внутри if fname и fname&& и fname||**\\ | ||
+ | тк set -e перестанет работать, перевыставить не поможет | ||
===== strongbash031 ===== | ===== strongbash031 ===== | ||
**нельзя использовать -EOF, используйте обычный EOF** | **нельзя использовать -EOF, используйте обычный EOF** | ||
Строка 821: | Строка 831: | ||
**2. set -o pipefail не работает в if $cmd; then и не нужно выставлять**\\ | **2. set -o pipefail не работает в if $cmd; then и не нужно выставлять**\\ | ||
нет смысла выставлять перед if\\ | нет смысла выставлять перед if\\ | ||
- | **3. Команда используется внутри pipe, ее код возврата не будет проанализирован**\\ | + | **3. ipret=$(ip r g |grep src) Команда используется внутри pipe, ее код возврата не будет проанализирован**\\ |
<hidden Что делать> | <hidden Что делать> | ||
Вы можете:\\ | Вы можете:\\ | ||
Строка 844: | Строка 854: | ||
** Нельзя использовать присвоение внутри if a=$(cmd); then **\\ | ** Нельзя использовать присвоение внутри if a=$(cmd); then **\\ | ||
+ | ===== strongbash036 todo ===== | ||
+ | Все аргументы нужно сохранять в глобальные переменные вида <code bash> | ||
+ | ARG_MYNAME=${1//--myname=/} | ||
+ | </code>\\ | ||
+ | или sys:parse_arg "$@" | ||
+ | |||
+ | ===== strongbash037 todo ===== | ||
+ | Запрещено использовать echo Без кавычек | ||
+ | <del>echo $tmp</del> | ||
+ | |||
===== TODO добавить в инструкцию как программировать на баше ===== | ===== TODO добавить в инструкцию как программировать на баше ===== | ||
+ | А пока читать коменты в http://opencarbon.ru/правила_разработки:как_надо_делать:разбор_crab_mysqldump2git | ||
+ | |||
**TODO** Описать виды функций __funct funct и виды переменных ARG CONF GLOBAL local и namespace сабшелы\\ | **TODO** Описать виды функций __funct funct и виды переменных ARG CONF GLOBAL local и namespace сабшелы\\ | ||
**TODO** | **TODO** | ||
В файл примера | В файл примера | ||
- | <code bash> | ||
- | iptables -t nat -I xge_pre -m addrtype ! --dst-type LOCAL \ | ||
- | -m set ! --match-set xge_auth_list src \ | ||
- | -m set ! --match-set xge_auth_list dst -j RETURN | ||
- | </code> | ||
Добавить в описание правил что grep -qm1 может уронить левую часть если это долгая команда и отгрепается первая строка пример | Добавить в описание правил что grep -qm1 может уронить левую часть если это долгая команда и отгрепается первая строка пример | ||
Строка 870: | Строка 887: | ||
{(rater>id=1|name=Прочитал_соглашения_кода:strongbash|type=vote|trace=user|tracedetails=1)} | {(rater>id=1|name=Прочитал_соглашения_кода:strongbash|type=vote|trace=user|tracedetails=1)} | ||
+ | |||
+ | ~~OWNERAPPROVE~~ | ||