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