ืืืืึทืืื ื ืืึทืฉ ืกืงืจืืคึผืก ืืื ืืื ืืืจ ืืืื ืคึฟืึทืจ ืึท ื ืึธืื ืืื ืึท ืืืืกืืึทืง, ืกืคึผืขืฆืืขื ืืืขื ื ืืึท ืึทืืืฉืึทื ื ืืขืจืฉืืึทื ืขื ืืื ืื ืืืืืกืืื ื ืงืึธืืขืืึทืกืข ืึธื ืืืึทืฆืืึทืืืง ืืึทืืจืึทืืืื ื ืคืื ืืฉืื ืคืื ืกืืจืืงืืืจ, ืืึธืืื ื ืืื ืจืืืืืึทืืืืึทืื. ืืืจ ืงืขื ืขื ืืขืคึฟืื ืขื ืืื ืืื ืึทืืึท ืกืืืืึทืืืึธื ืก ืึธืืขืจ ืจืขืื ืฆื ืืืื ืืืืืขื ืข ืืืกืืืืงืก ืึธืืขืจ ืืืขื ืืืจ ืคืืจื ืงืึธืืคึผืืขืงืก ืืขืจืืื ืคืื ืกืงืจืืคึผืก.
ืงืึธืืขืงืืืื
ืืื ืืขื ืึทืจืืืงื, ืืขืจ ืืืืจ ืฉืึทืจืขืก ืืืึธืก ืขืจ ืืื ืืขืืขืจื ื ืืื ืื ืืขืฆืืข ืืึธืจื, ืืื ืืืื ืขืืืขืืข ืคึผืจืึธืกื ืืืกืืืืงืก ืืืึธืก ืืึธืื ืืขืืืคื ืืื ืึทืืืขืง. ืืึธืก ืืื ืืืืืืืง ืืืืึทื ืืขืืขืจ ืืืืืืืืืจื ืืขืืืขืืึธืคึผืขืจ, ืืื ืขืืืขืืข ืคืื ื ืืื ืืืืขืจ ืงืึทืจืืขืจืข, ืึทืจืืขื ืืื ืกืงืจืืคึผืก ืฆื ืึธืืึทืืืื ืจืืืื ืึทืจืืขื ืืึทืกืงืก.
ืืจืึทืคึผ ืืึทื ืืืขืจืก
ืจืืึฟ ืืึทืฉ ืกืงืจืืคึผืก ืืื ืืืข ืืขืคึผืืึธื ืืขืจื ืงืืื ืืึธื ื ืืฆื ืึทื ืขืคืขืงืืืื ืงืืื ืึทืคึผ ืืขืงืึทื ืืืึทื ืืืขื ืขืคึผืขืก ืืืืืขืจืืื ืืึทืคึผืึทื ื ืืขืฉืึทืก ืฉืจืืคื ืืืจืืคืืจืื ื.
ืกืืจืคึผืจืืกืขืก ืงืขื ืขื ืืืืคืฉืืืื ืคืื ืื ืึทืจืืืก, ืึทืืึท ืืื ืจืืกืืืืื ื ืึท ืกืืื ืึทื ืคืื ืื ืืึทืจืฅ. ืืึทื ืืืื ื ืึทืืึท ืงืึทืกืขืก ืืื ืืึธืจ ืืืืืืืง ืฆื ืขื ืฉืืจ ืึทื ืื ืกืงืจืืคึผืก ืืขื ืขื ืคืึทืจืืึธืืืขื ืืขื ืื ืฆื ืืืืคื ืืืืฃ ืคึผืจืึธืืืงืฆืืข ืกืืกืืขืืขื. ืืื ืึธืคื ื ืืฆื ืึทืจืืืกืืึทื ื ืืึทื ืืืขืจืก ืฆื ืจืืกืคึผืึทื ื ืฆื ืกืื ืขืจืืึธืื ืืื ืืึธืก:
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 ืฆื ืืขืืขืงื ืขืจืจืึธืจืก ืืขืฉืึทืก ืึทื ืืืืืงืืื ื
ืขืก ืืื ืืืขืจื ืื ืึทืืจืืืืื ืขืคึผืขืก ืืื
ืืื ื ืืฆื ืขืก ืืื ืืืื ืืืืข ืึทื ืืืืืงืืื ื ืื ืืืืืจืึทื ืืึทื ืฅ ืฆื ืืึทืงืืืขื ืจืืคึผืึธืจืฅ ืืืขืื ืกืื ืืึทืงืก, ืกืขืืึทื ืืืงืก ืืื ืขืืืขืืข ืขืจืจืึธืจืก ืืื ืื ืงืึธื ืืืึธืก ืืื ืงืขื ืืึธืื ืืืกื ืืฉืขืช ืืขืืืขืืึธืคึผืื ื. ืืึธืก ืืื ืึท ืกืืึทืืืง ืึทื ืึทืืืกืืก ืืขืฆืืึทื ืคึฟืึทืจ ืืืื ืืึทืฉ ืกืงืจืืคึผืก ืืื ืืื ืจืขืงืึธืืขื ืืืจื ืฆื ื ืืฆื ืขืก.
ื ืืฆื ืืืื ืืืืืขื ืข ืึทืจืืืกืืึทื ื ืงืึธืืื
ืฆืืจืืงืงืืืขื ืงืึธืืื ืืื 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
}
ืืึทืืขืจืงืื ื: ืืืืข ืืืื ืกืคึผืขืฆืืขื ืึธืคึผืืขืืื ืืื ืื ืืืึทืืขืืืืืง ื ืขืืขื ืืืจ ืืขืคืื ืืจื ืฆื ืืืกืืืืื ืึทืงืกืึทืืขื ืึทืื ืึธืืืืขืจืจืืืืื ื ืกืืืืืืข ืืืขืจืืึทืืึทืื.
ืืึธืืื ื ืคืึทื ืืงืฉืึทื ื
ืฉืืื ืืื ืกืืจืึทืงืืฉืขืจื ืืึธืืื ื ืืื ืืืืืืืง ืฆื ืืืืื ืคึฟืึทืจืฉืืืื ืื ืจืขืืืืืึทืื ืคืื ืืืื ืฉืจืืคื. ืืื ืืื ืื ืืขืจืข ืืืื-ืืืจืื ืคึผืจืึธืืจืึทืืืื ื ืฉืคึผืจืึทืื, ืืื ืฉืืขื ืืืง ื ืืฆื ืืขืืืืจื ืืึธืืื ื ืคืึทื ืืงืฉืึทื ื ืืื ืืืื ืืึทืฉ ืกืงืจืืคึผืก, ืึทืืึท ืืื __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
ืืื ืื ืืขืจืข, ืึทืืึท ืืื ืกืืึทืงืง ืจืืคึผืึธืจืฅ, ืืขื ืขื ืงืึทื ืืืื ื ืกืขืคึผืขืจืึทืืื ืืื 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"
ืืึธืก ืืขืืคึผืก ืืืจ ืฆื ืืืขื ืืืคืืฆืืจื ืคึผืจืึธืืืขื / ืคึผืึทืืขืืขื ืืขืืืื ืืื ืกืงืจืืคึผืก ืืืึธืก ืืึทืจืคึฟื ืึทืคึผืืึทืืึทืืืืฉืึทื.
ืืื ืืืืง!
ืืืึธืก ืึทื ืืขืจืฉ ืฆื ืืืืขื ืขื:
ืืืื ืืื ืืคึผื ืงืึทืืฉืขืก. ืึท ืืืืฉืคึผืื ืคืื ืึท ืืขืฉืขืขื ืืฉ-ืืขืืจืืื ืึทืคึผืืึทืงืืืฉืึทื ืืืืืจื ืืืืฃ ืืืขืืืึธืึธืงืก ืืื ืื S3 ืืืืคืขืฅ ืกืืึธืจืืืืฉ ืคืื Mail.ru ืงืืึธืื ืกืึทืืืฉืึทื ื. ืืื ืืืขืจ ืืขืืขืืจืึทื ืงืึทื ืึทื ืืืขืื ืืืืืืึทื ืืจืึทื ืกืคืึธืจืืึทืฆืืข.
ืืงืืจ: www.habr.com