Strongbash
Различия
Здесь показаны различия между двумя версиями данной страницы.
| Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
|
соглашения_кода:strongbash [09.04.2018 14:32] admin |
соглашения_кода:strongbash [14.01.2020 09:26] (текущий) nikolay_carbonsoft |
||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| ===== Соглашение по строгому bash ===== | ===== Соглашение по строгому bash ===== | ||
| + | TODO_OSV возможно выборочно проверять номера из https://github.com/koalaman/shellcheck | ||
| ===== strongbash001 ===== | ===== strongbash001 ===== | ||
| Строка 101: | Строка 102: | ||
| ===== strongbash002 ===== | ===== strongbash002 ===== | ||
| - | **Должен быть установлен set -eu или include ::carbon.sys** \\ | + | **Должен быть установлен set -eu или include crab_sys.sh** \\ |
| **Категорически нельзя ставить <del>set -o pipefail</del> на весь файл см strongbash034_6** | **Категорически нельзя ставить <del>set -o pipefail</del> на весь файл см strongbash034_6** | ||
| <WRAP center round important>ВНИМАНИЕ set -eu это самое главное правило, оно дает режим strong.\\ | <WRAP center round important>ВНИМАНИЕ set -eu это самое главное правило, оно дает режим strong.\\ | ||
| Строка 307: | Строка 308: | ||
| **В начале каждого файла должен быть echo START и USAGE, INFO, EXAMPLE\\ | **В начале каждого файла должен быть echo START и USAGE, INFO, EXAMPLE\\ | ||
| В конце каждого файла должны быть echo SUCCESS и exit 0 :\\ ** | В конце каждого файла должны быть echo SUCCESS и exit 0 :\\ ** | ||
| - | Для продвинутых разработчиков лучше использовать в начале скрипт: include ::carbon.sys | + | Для продвинутых разработчиков лучше использовать в начале скрипт: include crab_sys.sh |
| <hidden Почему...> | <hidden Почему...> | ||
| - exit 0 для того чтобы избежать случайный код возврата. | - exit 0 для того чтобы избежать случайный код возврата. | ||
| - USAGE, INFO, EXAMPLE использования важен, чтобы программа могла жить в будущем и не была выброшена. | - USAGE, INFO, EXAMPLE использования важен, чтобы программа могла жить в будущем и не была выброшена. | ||
| - echo START echo SUCCESS делает удобным использование и чтение консоли и логов. | - echo START echo SUCCESS делает удобным использование и чтение консоли и логов. | ||
| - | - include ::carbon.sys позволит автоматически деалать echo START echo SUCCESS echo FAIL sys::usage "$@" # --help и показывает callstack при падении | + | - include crab_sys.sh позволит автоматически деалать echo START echo SUCCESS echo FAIL sys::usage "$@" # --help и показывает callstack при падении |
| </hidden> | </hidden> | ||
| <hidden Пример...> | <hidden Пример...> | ||
| Строка 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 | ||
| Строка 354: | Строка 356: | ||
| <code bash> | <code bash> | ||
| #!/bin/bash | #!/bin/bash | ||
| - | source ::carbon.sys | + | source crab_sys.sh |
| sys::usage "$@" | sys::usage "$@" | ||
| ### --help Info: Автоматически создавать и коммитить все файлы в каталоге | ### --help Info: Автоматически создавать и коммитить все файлы в каталоге | ||
| Строка 381: | Строка 383: | ||
| - | <color #22b14c>Или для тихих файлов с carbon.sys:</color> | + | <color #22b14c>Или для тихих файлов с crab_sys.sh:</color> |
| <code bash> | <code bash> | ||
| __SILENT=TRUE | __SILENT=TRUE | ||
| - | source ::carbon.sys | + | source crab_sys.sh |
| ### --help Info: Автоматически создавать и коммитить все файлы в каталоге | ### --help Info: Автоматически создавать и коммитить все файлы в каталоге | ||
| ### --help Usage: auto_git.sh [install] /var/www/html | ### --help Usage: auto_git.sh [install] /var/www/html | ||
| Строка 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 \ | ||
| Строка 642: | Строка 650: | ||
| fi | fi | ||
| </code> | </code> | ||
| - | <color #22b14c>Хорошо при include ::carbon.sys</color> | + | <color #22b14c>Хорошо при include crab_sys.sh</color> |
| <code bash> | <code bash> | ||
| sys::usage "$@" и | sys::usage "$@" и | ||
| Строка 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> | ||
| + | |||
| + | |||
| + | ===== strongbash038 todo ===== | ||
| + | Нужно всегда использовать переменные и аргументы в кавычках. | ||
| + | <code bash> | ||
| + | Нельзя: | ||
| + | if [ $1 = info ]; then | ||
| + | echo $1 | ||
| + | fi | ||
| + | |||
| + | Нужно: | ||
| + | if [ "$1" = 'info' ]; then | ||
| + | echo "$1" | ||
| + | fi | ||
| + | </code> | ||
| + | |||
| + | |||
| ===== 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: | Строка 902: | ||
| {(rater>id=1|name=Прочитал_соглашения_кода:strongbash|type=vote|trace=user|tracedetails=1)} | {(rater>id=1|name=Прочитал_соглашения_кода:strongbash|type=vote|trace=user|tracedetails=1)} | ||
| + | |||
| + | ~~OWNERAPPROVE~~ | ||