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~~