
bash แกแแ แแแขแแแแก แแแแแ แแแ แฐแแแแก แแแแกแแก แซแแแแแก แแแแแก แแ แแแแจแ, แแแแกแแแฃแแ แแแแ แแแจแแ, แ แแแแกแแช แแฎแแแ แแแแแขแแแแแ แฉแแแแแ แแ แกแแแฃแ แแแแแแแก แแแแแจแ แกแขแ แฃแฅแขแฃแ แแก, แญแ แแกแ แแ แกแแแแแแแแแแก แกแแแแแฎแแแแก แแ แแฃแแ แแแแฎแแแแแก แแแ แแจแ. แแฅแแแ แจแแแแซแแแแ แแฆแแแฉแแแแ แแกแแ แกแแขแฃแแชแแแแจแ แแ แกแแแฃแแแ แ แจแแชแแแแแแแก แแแแ, แแ แกแแ แแแขแแแแก แ แแฃแแ แแ แแแแก แแแ แแแแกแแก.
แแฃแแแ แแแ แแแแ แกแขแแขแแ แ แแแแแแแแแชแแแแแ, แ แแแแแแช แแแแแฎแแแ แแแแ แแแฌแแ แแ, แแแแแ แแแ แแ แฃแแแ แจแแแแแฎแแ แแฅแแแแ แกแแ แแแขแแแ. แแแแฏแแ แแ แแฃ แแ แ, แแ แแคแแ แ แแญแแ แแแแก แกแฃแคแแ, แแแแแกแแงแแแแแแแ แแแ แแแจ แแแแแก แแแฌแแ แแก แแแแงแแคแแแแแแก, แ แแแแแแช แแฃแจแแแแก แงแแแแ แฏแแ แแ.
แกแขแแขแแแจแ แแแขแแ แ แแแแแ แแแก แแแแก, แ แแช แแแ แแกแฌแแแแ แแแแ แ แแแแแแแแ แฌแแแก แแแแแแแแแแแจแ, แแกแแแ แ แแแแ แช แแแแแแ แ แแแแ แชแแแแแฃแ แจแแชแแแแแแก, แ แแแแแแแแช แแก แแแฃแคแ แแฎแแแแ. แแก แแแแจแแแแแแแแแแ, แ แแแแแ แแ แแแ แแแฃแแ แฃแแ แฃแแแแแงแแคแแก แงแแแแ แจแแแฅแแแแแ, แแแแแกแ แแแ แแแ แแก แแแ แแแแฃแ แแแแแแขแจแ, แแฃแจแแแแก แกแแ แแแขแแแแแ แ แฃแขแแแฃแแ แกแแแฃแจแแ แแแแชแแแแแแก แแแขแแแแขแแแแชแแแกแแแแก.
แฎแแคแแแแแก แแแแแฃแจแแแแแแแแ
bash แกแแ แแแขแแแแก แฃแแแขแแกแแแ, แ แแแแแกแแช แแ แจแแแฎแแแแ แแแแ , แแ แแกแแ แแก แแงแแแแแก แแคแแฅแขแฃแ แแแกแฃแคแแแแแแแก แแแฅแแแแแแก, แ แแแแกแแช แ แแฆแแช แแแฃแแแแแแแ แฎแแแแ แกแแ แแแขแแก แจแแกแ แฃแแแแแก แแ แแก.
แกแแฃแ แแ แแแแแ แจแแแซแแแแ แฌแแ แแแแจแแแก แแแ แแแแ, แ แแแแ แแชแแ แกแแแแแแแก แแแฆแแแ แแแ แแแแแแ. แแกแแแ แจแแแแฎแแแแแแแก แแแแฃแจแแแแแ แซแแแแ แแแแจแแแแแแแแแแ แแแแกแแแแก, แ แแ แกแแ แแแขแแแ แกแแแแแ แแกแแ แกแแแแแแ แแงแแก แฌแแ แแแแแแก แกแแกแขแแแแแแ แแแกแแจแแแแแ. แแ แฎแจแแ แแ แแแงแแแแ แแแกแแกแแแแแแก แแแแแฃแจแแแแแแแแก, แ แแ แแฃแแแกแฃแฎแ แแกแแ แกแชแแแแ แแแก:
function handle_exit() {
// Add cleanup code here
// for eg. rm -f "/tmp/${lock_file}.lock"
// exit with an appropriate status code
}
// trap <HANDLER_FXN> <LIST OF SIGNALS TO TRAP>
trap handle_exit 0 SIGHUP SIGINT SIGQUIT SIGABRT SIGTERM
trap แแ แแก แญแฃแ แแแก แฉแแจแแแแแฃแแ แแ แซแแแแแ, แ แแแแแแช แแแแแฎแแแ แแแแ แแแแ แแแแกแขแ แแ แแ แแแกแฃแคแแแแแแแก แคแฃแแฅแชแแ, แ แแแแแแช แแแแแแซแแฎแแแ แแแแแกแแแแ แ แกแแแแแแแก แจแแแแฎแแแแแจแ. แแฃแแชแ แแแแกแแแฃแแ แแแฃแแ แกแแคแ แแฎแแแแ แกแแญแแ แ แแกแแ แแแแแฃแจแแแแแแแแแแ, แ แแแแ แแชแแ SIGINT, แ แแช แแฌแแแแก แกแชแแแแ แแก แจแแฌแงแแแขแแก.
แแแ แแ แแแแกแ, แฃแแแขแแก แจแแแแฎแแแแแจแ แแฅแแแ แแฎแแแแ แฃแแแ แแแแญแแ แแ EXIT, แแแแ แแ แแแแ แแกแแ, แ แแ แแฅแแแ แจแแแแซแแแแ แ แแแแฃแ แแ แแแแ แแแ แกแแ แแแขแแก แฅแชแแแ แแแแแแฃแแ แแแแแแแแฃแแแฃแ แ แกแแแแแแแกแแแแก.
แฉแแจแแแแแฃแแ แแแแแแแฅแขแแก แคแฃแแฅแชแแแแ - แกแฌแ แแคแ แจแแฌแงแแแขแ แจแแชแแแแแแแ
แซแแแแแ แแแแจแแแแแแแแแแ แจแแชแแแแแแแ แ แแแแแ แแแ, แ แแแแ แช แแ แแกแแแ แฌแแ แแแแฅแแแแแ แแ แกแฌแ แแคแแ แจแแฌแงแแแขแแ แจแแกแ แฃแแแแ. แแ แแคแแ แ แจแแแซแแแแ แแงแแก แฃแแ แแกแ, แแแแ แ แแ แซแแแแแแก แแแจแแแแ แแกแ:
rm -rf ${directory_name}/*
แแแฎแแแ แแแแแแแแแกแฌแแแแ, แ แแ แชแแแแแ directory_name แแ แแ แแก แแแแกแแแฆแแ แฃแแ.
แแแแจแแแแแแแแแแ แฉแแจแแแแแฃแแ แคแฃแแฅแชแแแแแก แแแแแงแแแแแ แแกแแแ แกแชแแแแ แแแแก แแแกแแแแแ แแแแแ set, แ แแแแ แแชแแ set -o errexit, set -o pipefail แแ set -o nounset แกแชแแแแ แแก แแแกแแฌแงแแกแจแ. แแก แคแฃแแฅแชแแแแ แฃแแ แฃแแแแแงแแคแก, แ แแ แแฅแแแแ แกแแ แแแขแ แแแแแแ, แ แแแแ แช แแ แจแแฎแแแแแ แ แแแแ แแ แแแฃแแแแแแ แแแแแกแแกแแแแ แแแแก, แแแแแฃแงแแแแแแ แชแแแแแแแแก แแแแแงแแแแแแก, แแแแแ แแแแแชแแแฃแ แแ แแกแฌแแ แ แแ แซแแแแแแแก แแ แ.แจ.
#!/usr/bin/env bash
set -o errexit
set -o nounset
set -o pipefail
function print_var() {
echo "${var_value}"
}
print_var
$ ./sample.sh
./sample.sh: line 8: var_value: unbound variable
แจแแแแจแแแ: แฉแแจแแแแแฃแแ แคแฃแแฅแชแแแแ, แ แแแแ แแชแแ set -o errexit, แแแแแแ แกแแ แแแขแแแแ, แ แแแแ แช แแ แแฅแแแแ "แแแแแ" แแแแ แฃแแแแแก แแแแ (แแฃแแแก แแแ แแ). แแแแขแแ แฃแแฏแแแแกแแ แจแแแแแแขแแแแ แจแแชแแแแแก แแแ แแแแฃแแ แแแแฃแจแแแแแ, แแแแแแแแแ:
#!/bin/bash
error_exit() {
line=$1
shift 1
echo "ERROR: non zero return code from line: $line -- $@"
exit 1
}
a=0
let a++ || error_exit "$LINENO" "let operation returned non 0 code"
echo "you will never see me"
# run it, now we have useful debugging output
$ bash foo.sh
ERROR: non zero return code from line: 9 -- let operation returned non 0 code
แกแแ แแแขแแแแก แแ แแแแ แแแฌแแ แ แแแแซแฃแแแแ, แแงแแ แฃแคแ แ แคแ แแฎแแแแ แกแแ แแแขแแก แงแแแแ แแ แซแแแแแแก แฅแชแแแแกแแแ แแแแแแจแแ แแแแ แแ แแแแญแแ แแขแแ แจแแชแแแแแก แจแแกแแซแแแแแแแ, แกแแแแ แแก แแแแชแแแ.
ShellCheck แแฆแแแแฉแแแแก แจแแชแแแแแแ แแแแแแแแ แแแแก แแ แแก
แฆแแ แก แแกแแแแกแ แ แแฆแแชแแก แแแขแแแ แแ แแแ แแฅแแแแ แแแแแแแแ แแแแกแ แแ แขแแกแขแแ แแแแก แแแแกแแแแแแแจแ, แ แแแ แจแแแแแฌแแแ แแฅแแแแ bash แแแแ แกแแฃแแแแแกแ แแ แแฅแขแแแแก แฌแแแแแฆแแแแ.
แแ แแแก แแแงแแแแ แฉแแแก แแแแแแแแ แแ แแแแแแแแ แแแแก แแแ แแแแจแ, แ แแแ แแแแแฆแ แแแแแ แแจแแแ แกแแแขแแฅแกแแก, แกแแแแแขแแแแกแ แแ แแแแแก แแแแแแ แแ แจแแชแแแแแก แจแแกแแฎแแ, แ แแแแแแช แจแแแซแแแแ แแแแแแ แฉแแก แจแแแฃแจแแแแแแกแแก. แแก แแ แแก แกแขแแขแแแฃแ แ แแแแแแแแก แแแกแขแ แฃแแแแขแ แแฅแแแแ bash แกแแ แแแขแแแแกแแแแก แแ แแ แแแ แฉแแแ แแแแแแงแแแแ แแแ.
แกแแแฃแแแ แ แแแกแแกแแแแแ แแแแแแแก แแแแแงแแแแแแ
POSIX-แจแ แแแแ แฃแแแแแก แแแแแแ แแ แแ แแก แแฎแแแแ แแฃแแ แแ แแ แแ, แแ แแแแ แแฃแแแแแแ แแ แแ แ-แแฃแแแแแแ แแแแจแแแแแแแ. แแแแแแงแแแแ แแก แคแฃแแฅแชแแแแ, แ แแแ แแแแแ แฃแแแ แแแ แแแแฃแแ แจแแชแแแแแก แแแแแแ (201-254 แจแแ แแก) แจแแชแแแแแก แกแฎแแแแแกแฎแแ แจแแแแฎแแแแแกแแแแก.
แจแแแแแ แแก แแแคแแ แแแชแแ แจแแแซแแแแ แแแแแงแแแแแฃแ แแฅแแแก แกแฎแแ แกแแ แแแขแแแแ, แ แแแแแแแช แแฎแแแแแ แแฅแแแแกแแก, แ แแแ แแแแแแ, แ แ แขแแแแก แจแแชแแแแ แแแฎแแ แแ แจแแกแแแแแแกแแ แ แแแแแ แแแ แแแแฎแแแแแก:
#!/usr/bin/env bash
SUCCESS=0
FILE_NOT_FOUND=240
DOWNLOAD_FAILED=241
function read_file() {
if ${file_not_found}; then
return ${FILE_NOT_FOUND}
fi
}
แจแแแแจแแแ: แแแฎแแแ, แแแแกแแแฃแแ แแแแ แคแ แแฎแแแแ แแงแแ แแฅแแแ แแแแ แแแแกแแแฆแแ แฃแ แชแแแแแแแแก แกแแฎแแแแแแแ, แ แแแ แแแแแแแ แแแชแแแแ แจแแแแฎแแแแแแ แแแแแคแแ แแ แแแ แแแแก แชแแแแแแแ.
แแฃแ แแแแแก แคแฃแแฅแชแแแแ
แแแแแแ แแ แกแขแ แฃแฅแขแฃแ แแ แแแฃแแ แแฃแ แแแแ แแแแจแแแแแแแแแแ แแฅแแแแ แกแแ แแแขแแก แจแแแแแแแแก แแแแแแแ แแแกแแแแแแ. แ แแแแ แช แกแฎแแ แแแฆแแแ แแแแแก แแ แแแ แแแแ แแแแก แแแแแแก แจแแแแฎแแแแแจแ, แแ แงแแแแแแแแก แแแงแแแแ แแฃแแแแ แแ แแฃแ แแแแแก แคแฃแแฅแชแแแแก แฉแแแก bash แกแแ แแแขแแแจแ, แ แแแแ แแชแแ __msg_info, __msg_error แแ แแกแ แจแแแแแ.
แแก แฎแแแก แฃแฌแงแแแก แฎแ-แขแงแแก แกแขแแแแแ แขแแแแแฃแแ แกแขแ แฃแฅแขแฃแ แแก แฃแแ แฃแแแแแงแแคแแก แแฎแแแแ แแ แ แแแแแแแก แชแแแแแแแแแแก แจแแขแแแแ:
#!/usr/bin/env bash
function __msg_error() {
[[ "${ERROR}" == "1" ]] && echo -e "[ERROR]: $*"
}
function __msg_debug() {
[[ "${DEBUG}" == "1" ]] && echo -e "[DEBUG]: $*"
}
function __msg_info() {
[[ "${INFO}" == "1" ]] && echo -e "[INFO]: $*"
}
__msg_error "File could not be found. Cannot proceed"
__msg_debug "Starting script execution with 276MB of available RAM"
แ แแแแ แช แฌแแกแ, แแชแแแแแ, แฉแแแก แกแแ แแแขแแแจแ แ แแแแ แแแฅแแแแแแ แแงแแก __init, แกแแแแช แแแแแ แแก แชแแแแแแแ แแ แกแแกแขแแแแก แกแฎแแ แชแแแแแแแ แแแแชแแแแแแแแฃแแแ แแ แแแงแแแแแฃแแแ แแแแฃแแแกแฎแแแ แแแแจแแแแแแแแแแ. แแก แชแแแแแแแ แแกแแแ แจแแแซแแแแ แแแงแแแแแก แแ แซแแแแแแก แฎแแแแก แแแ แแแแขแ แแแแแแ แกแแ แแแขแแก แแแแแซแแฎแแแแก แแ แแก.
แแแแแแแแแ, แ แแฆแแช แแกแแแแกแ:
$ ./run-script.sh --debug
แ แแแแกแแช แแกแแแ แกแแ แแแขแ แจแแกแ แฃแแแแฃแแแ, แแก แฃแแ แฃแแแแแงแแคแก แกแแกแขแแแแก แแแกแจแขแแแแก แแแ แแแแขแ แแแแก แแแงแแแแแแก แแแแฃแแแกแฎแแแ แแแแจแแแแแแแแแแ, แแฃ แกแแญแแ แแ, แแ แแแแแแฃแ แแแแชแแแแแแแชแแแก แ แแแแ แจแแกแแแแแแกแแ, แกแแญแแ แแแแแก แจแแแแฎแแแแแจแ.
แแ แฉแแแฃแแแแ แแ แแ แฉแแแแแก แแแคแฃแซแแแ แแแแแ, แแฃ แ แ แฃแแแ แแแฎแแแก แแแแชแแแแแแแชแแ แแ แ แ แแ แ, แแแแฎแแแ แแแแแก แแแขแแ แคแแแกแกแ แแ แแ แแแแคแแแฃแ แแชแแแก แแแขแแแแแก แจแแ แแก แฃแ แแแแ แแแแชแแแแก แกแแคแฃแซแแแแแ, แ แแแแแแจแแช แแแแฎแแแ แแแแแก แจแแฃแซแแแ/แฃแแแ แฉแแฃแฆแ แแแแแแก.
แแ แฅแแขแแฅแขแฃแ แ แฎแแแแฎแแแ แแแแแงแแแแแแกแแแแก แแ แกแฃแคแแ แกแแกแขแแแแก แแแแแแแ แแแแ
แแแแฃแแฃแ แ / แแ แแแแแฏแแ แแแ แแแแแงแแแแแแก แแแแ
โโโ framework
โ โโโ common
โ โ โโโ loggers.sh
โ โ โโโ mail_reports.sh
โ โ โโโ slack_reports.sh
โ โโโ daily_database_operation.sh
แแ แแแแแฎแแ แชแแแแ แกแแชแแแก, แ แแแแแแช แจแแแแซแแแ แแแแแแแงแแแ แแฎแแแ แแ แแแฅแขแแก/แแแจ แกแแ แแแขแแก แแแแชแแแแแแแชแแแกแแแแก, แ แแแแแก แแแแแแแแ แแแแช แแกแฃแ แก. แงแแแแแคแแ แ, แ แแกแ แฎแแแแฎแแ แแแแแงแแแแแแช แจแแกแแซแแแแแแแ, แจแแแซแแแแ แจแแแแแฎแแก แกแแชแแแจแ แแ แแแแซแแแแแก แกแฎแแ แแ แแแฅแขแแแแก แแแแ , แ แแแแแแกแแช แกแฃแ แ แแ แคแฃแแฅแชแแแก แแแแแงแแแแแ. แแ แแแฅแขแแแแก แแ แแแแ แแ แแแแแแแแ แแแแจแแแแแแแแแ แแแชแแ แแแก แกแฎแแ แกแแ แแแขแแแแก แแแแแก แแ แแกแแแ แฃแแ แฃแแแแแงแแคแก, แ แแ แแแแแก แแแแ แแชแแ แแ แแ แแแ แขแแแ แจแแกแแแแฌแแแแแแ.
แ แแแแ แช แแแแแ แแแชแแแฃแ แแแแแแแแจแ, แงแแแแ แแฃแ แแแแแก แคแฃแแฅแชแแ, แ แแแแ แแชแแ __msg_info, __msg_error แแ แกแฎแแแแ, แ แแแแ แแชแแ Slack-แแก แแแแแ แแจแแแ, แชแแแแ แแแชแแแฃแแแ common/* แแ แแแแแแแฃแ แแ แแแแแแจแแ แแแ แกแฎแแ แกแชแแแแ แแแจแ, แ แแแแ แแชแแ daily_database_operation.sh.
แแแขแแแแ แกแฃแคแแ แกแแกแขแแแ
แแฃ แแฅแแแ แแขแแแ แแแแ แ แแแแ แ แแกแฃแ แกแก แกแแ แแแขแแก แแแจแแแแแกแแก, แ แแแแแแแแแแฃแแแ แงแแแแ แแกแแแ แแแแแชแแแแก แจแแแแฎแแ แกแแแแแ แ แแแ แแฅแขแแ แแแจแ แจแแแแฎแแแแแแ แกแแฎแแแแ, แแแ. /tmp/AlRhYbD97/*. แแฅแแแ แจแแแแซแแแแ แแแแแแงแแแแ แจแแแแฎแแแแแแ แขแแฅแกแขแแก แแแแแ แแขแแ แแแ แแแ แแฅแขแแ แแแก แกแแฎแแแแก แจแแกแแ แฉแแแแ:
rand_dir_name="$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 16 | head -n 1)"
แกแแแฃแจแแแก แแแกแ แฃแแแแแก แจแแแแแ, แแกแแแ แแแ แแฅแขแแ แแแแแก แแแกแฃแคแแแแแแ แจแแกแแซแแแแแแแ แแแแแ แแแแฎแแแฃแ แแแฃแญแแก แแแแแฃแจแแแแแแแแจแ. แแฃ แแ แแแแแแ แแแ แแฅแขแแ แแแแ แแ แแแ แฃแแแแแ, แแกแแแ แแ แแแแแแ แแ แ แแฆแแช แแขแแแแ แแฌแแแแก แฐแแกแขแแ แแแฃแแแแแแ แแ แแแแแแแแก, แ แแแแ แแชแแ แกแ แฃแแ แแแกแแ.
แแแแแแแแแก แคแแแแแแแก แแแแแงแแแแแ
แฎแจแแ แแ แแฅแแแ แฃแแแ แแแ แฌแแฃแแแแ, แ แแ แกแแ แแแขแแก แแฎแแแแ แแ แแ แแแกแขแแแชแแ แแฃแจแแแแก แฐแแกแขแแ แแแแแกแแแแ แแ แแก. แแก แจแแแซแแแแ แแแแแแแแก แแแแแแแแแก แคแแแแแแแก แแแแแงแแแแแแ.
แแ แฉแแแฃแแแแ แแ แแฅแแแ แแแแแแแแแก แคแแแแแแก /tmp/project_name/*.lock แแ แจแแแแแฌแแแ แแแแ แงแแคแแ แกแชแแแแ แแก แแแกแแฌแงแแกแจแ. แแก แแฎแแแ แแแ แกแแ แแแขแก แแจแแแแแ แจแแฌแงแแแขแแก แแ แแแแแแแ แแแชแแแแก แกแแกแขแแแแก แแแแแแแ แแแแแก แแแฃแแแแแแแ แชแแแแแแแแแ แแแ แแแแแฃแ แแ แแแจแแแแฃแแ แกแฎแแ แกแแ แแแขแแก แแแแ . แแแแแแแแแก แคแแแแแแ แแ แแ แแก แกแแญแแ แ, แแฃ แแฅแแแ แแญแแ แแแแแ แแแแแ แกแแ แแแขแแก แแแ แแแแแฃแ แแ แจแแกแ แฃแแแแ แแแชแแแฃแ แฐแแกแขแแ.
แแแแแแแ แแ แแแแฃแแฏแแแแกแแ
แฉแแแ แฎแจแแ แแ แแแญแแ แแแแ แแฃแจแแแแ แกแแ แแแขแแแแแ, แ แแแแแแแช แแฃแจแแแแแ แฎแแแแ แซแแแแ แแ แแแก แแแแแแแแแแแจแ, แ แแแแ แแชแแ แงแแแแแแฆแแฃแ แ แแแแแชแแแแ แแแแแก แแแแ แแชแแแแ. แแกแแแ แแแแ แแชแแแแ, แ แแแแ แช แฌแแกแ, แแแแชแแแก แแแแแฏแแแแก แแแแแแแแแแ แแแแก: แแแแแชแแแแ แฉแแขแแแ แแแแก, แแแแแแแแแแแก แจแแแแฌแแแแแก, แแแแแชแแแแ แแแแแ แขแก, แกแขแแขแฃแกแแก แแแฎแกแแแแแแแแก แแแแแแแแแก แแ แ.แจ.
แแกแแ แจแแแแฎแแแแแแจแ, แแ แงแแแแแแแแก แแชแแแแแ แกแแ แแแขแแก แแแงแแคแ แชแแแแแฃแ แแชแแ แ แกแแ แแแขแแแแ แแ แแแชแแแแ แแแแ แกแขแแขแฃแกแแก แแ แจแแกแ แฃแแแแแก แแ แแแก แแแแแงแแแแแแ:
time source "${filepath}" "${args}">> "${LOG_DIR}/RUN_LOG" 2>&1
แแแแแแแแแแแ แแ แแฎแแแแ แจแแกแ แฃแแแแแก แแ แแก:
tac "${LOG_DIR}/RUN_LOG.txt" | grep -m1 "real"
แแก แแแฎแแแ แแแ แแแแแแชแแ แแ แแแแแแฃแ แ/แแแแ แกแคแแ แแแแ แกแแ แแแขแแแจแ, แ แแแแแแกแแช แกแญแแ แแแแแ แแแขแแแแแแชแแ.
แแแกแฃแ แแแแ แฌแแ แแแขแแแแก!
แแแแแ แ แ แฌแแแแแแฎแแ:
แฌแงแแ แ: www.habr.com
