====== Важные Приемы для 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 ===== 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" \ -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 ===== pidof -c ===== **Выводит список процессов только текущего chroot** Часто нужно проверить наличие процесса в системе по имени. Платформа использует chroot контейнеры, потому задача усложняется: нам обычно не интересны одноимённые процессы из других контейнеров.\\ Я встречал 2 подхода: * нет проверки контейнера(что по-сути потенциальный баг) * проверка сделана на наличию специфичных для контейнера файлов (видимо как исправление этого бага) У утилиты pidof есть опция -c, которая делает нужную проверку, и выводит процессы только из текущего chroot. \\ Например: \\ `pidof -с crond` - выведет только крон(ы) текущего контейнера. ===== Не запускать дубль скрипта ===== if pidof -csxo %PPID "${0##*/}"; then echo "Already running" >&2 exit 1 fi Опции: * -c - в текущем chroot * -s - одного pid достаточно * -x - проверять скрипты * -o %PPID - исключить из поиска вызывающий скрипт, т.е. нас самих. * "${0##*/}" - имя скрипта ===== Не сохранять историю ===== Иногда, производя работы нужно скрыть использование определённых команд. Чтобы bash не сохранял историю по завершению интерактивной сессии можно сделать unset HISTFILE ===== Удалить аргумент из списка ===== Сложные изменения $@ # удаляем --user-login из списка аргументов for arg do shift [[ "$arg" = "--user-login="* ]] && continue set -- "$@" "$arg" done ===== Убрать/заменить не валидные символы ===== Бывает нужно из строки сделать имя файл или переменной, и при этом, чтобы имя было из определённых символов: # замена всех не букв-цифр на _ # есть и другие классы, также можно указать конкретные символы и диапазоны 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 * -c = --complement, дополнение множества символов из первого параметра (все остальные символы, кроме перечисленных) * -d = --delete * -s = --squeeze-repeats - убрать повторы указанных символов ~~OWNERAPPROVE~~ Обязательны к прочтению всем /*Не удаляйте эту строку и ниже!*/ {(rater>id=1|name=Прочитал_howto:howto_bash|type=vote|trace=user|tracedetails=1)}