Howto Bash

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
howto:howto_bash [04.09.2018 06:55]
sergey_osintsev Approved(admin 2018/09/04 06:58)
howto:howto_bash [16.06.2020 07:34] (текущий)
s.troshin
Строка 1: Строка 1:
 ====== Важные Приемы для BASH и Linux ====== ====== Важные Приемы для BASH и Linux ======
  
 +===== O_DIRECT Как скопировать файлы не портя кеш, чтоб комп не тормозил =====
 +  * Удобно - crab_cp_nocache
 +  * Нативно - dd conv=noerror iflag=direct if="​$src"​ of="​$dst"​ oflag=direct bs=128000
 +  * Если большой файл скопировать на другой сервер - crb_sync
 +  * Если не только копирование,​ а разные утилиты частично - https://​github.com/​Feh/​nocache он использует posix_fadvise(fd,​ offset, len, POSIX_FADV_DONTNEED). Чистит только при закрытии поэтому при больших файлах толку мало.
 +
 +===== Как отправить почту с авторизацией из shell стандартной утилитой mail =====
 +<code bash>
 +yum install mailx
 +
 +echo -e \
 +"To: admin@example.com
 +Subject: Hello Admin\n
 +Это тело сообщения\n"​ \
 +                | mail -S ssl-verify=ignore \
 +                -S nss-config-dir=/​etc/​pki/​nssdb \
 +                -S hostname=myhost.example.com \
 +                -S smtp=smtp.example.com:​465 ​ \
 +                -S smtp-use-starttls \
 +                -S from="​user123@example.com<​user123@example.com>"​ \
 +                -S smtp-auth=login -S smtp-auth-password='​*********'​ \
 +                -S smtp-auth-user=user123 -S ssl-no-default-ca \
 +                -a "​admin@example.com"​ \
 +                -t \
 +                -S verbose
 +</​code>​
 +
 +===== pidof -c =====
 +
 +**Выводит список процессов только текущего chroot**
 +
 +Часто нужно проверить наличие процесса в системе по имени. Платформа использует chroot контейнеры,​ потому задача усложняется:​ нам обычно не интересны одноимённые процессы из других контейнеров.\\
 +Я встречал 2 подхода:​
 +
 +  * нет проверки контейнера(что по-сути потенциальный баг)
 +  * проверка сделана на наличию специфичных для контейнера файлов (видимо как исправление этого бага)
 +
 +У утилиты pidof есть опция -c, которая делает нужную проверку,​ и выводит процессы только из текущего chroot. \\ Например:​ \\ `pidof -с crond` - выведет только крон(ы) текущего контейнера.
 +
 +
 +===== Не запускать дубль скрипта =====
 +<​code>​
 +if pidof -csxo %PPID "​${0##​*/​}";​ then
 + echo "​Already running"​ >&2
 + exit 1
 +fi
 +</​code>​
 +Опции:
 +  * -c - в текущем chroot
 +  * -s - одного pid достаточно
 +  * -x - проверять скрипты
 +  * -o %PPID - исключить из поиска вызывающий скрипт,​ т.е. нас самих.
 +  * "​${0##​*/​}"​ - имя скрипта
 +
 +===== Не сохранять историю =====
 +
 +Иногда,​ производя работы нужно скрыть использование определённых команд.
 +
 +Чтобы bash не сохранял историю по завершению интерактивной сессии можно сделать
 +
 +<​code>​unset HISTFILE
 +</​code>​
 +
 +===== Удалить аргумент из списка =====
 +
 +Сложные изменения $@
 +
 +<​code>​
 +# удаляем --user-login из списка аргументов
 +for arg do
 + shift
 + [[ "​$arg"​ = "​--user-login="​* ]] && continue
 + set -- "​$@"​ "​$arg"​
 +done
 +</​code>​
 +
 +
 +===== Убрать/​заменить не валидные символы =====
 +
 +Бывает нужно из строки сделать имя файл или переменной,​ и при этом, чтобы имя было из определённых символов:​
 +
 +<code bash>
 +# замена всех не букв-цифр на _
 +# есть и другие классы,​ также можно указать конкретные символы и диапазоны
 +ts@ts:~$ echo "$(tr -c '​[:​alnum:​]'​ '​_'​ <<<"​var some/​value+other?​thing"​)"​
 +var_some_value_other_thing_
 +
 +# удаление всех не букв-цифр и _
 +ts@ts:~$ echo "$(tr -cd '​[:​alnum:​]_'​ <<<​ "​var_some??​_value+++_other_thing"​)"​
 +var_some_value_other_thing
 +
 +# Очень полезно иногда заменить несколько пробелов одним, чтобы использовать потом cut
 +ts@ts:~$ tr -s '​[:​blank:​]'​ <<<"​field1 ​      ​field2 ​      ​field3"​ | cut -d " " -f 1,3
 +field1 field3
 +</​code>​
 +
 +  * -c = --complement,​ дополнение множества символов из первого параметра (все остальные символы,​ кроме перечисленных)
 +  * -d = --delete
 +  * -s = --squeeze-repeats - убрать повторы указанных символов
 +
 +~~OWNERAPPROVE~~ Обязательны к прочтению всем /*Не удаляйте эту строку и ниже!*/
  
-~~OWNERAPPROVE~~ 
-Обязательны к прочтению всем /*Не удаляйте эту строку и ниже!*/ 
 {(rater>​id=1|name=Прочитал_howto:​howto_bash|type=vote|trace=user|tracedetails=1)} {(rater>​id=1|name=Прочитал_howto:​howto_bash|type=vote|trace=user|tracedetails=1)}