Bash แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜แƒก แƒกแƒแƒฃแƒ™แƒ”แƒ—แƒ”แƒกแƒ แƒžแƒ แƒแƒฅแƒขแƒ˜แƒ™แƒ: แƒกแƒฌแƒ แƒแƒคแƒ˜ แƒ’แƒ–แƒแƒ›แƒ™แƒ•แƒšแƒ”แƒ•แƒ˜ แƒกแƒแƒœแƒ“แƒ แƒ“แƒ แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก Bash แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก

Bash แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜แƒก แƒกแƒแƒฃแƒ™แƒ”แƒ—แƒ”แƒกแƒ แƒžแƒ แƒแƒฅแƒขแƒ˜แƒ™แƒ: แƒกแƒฌแƒ แƒแƒคแƒ˜ แƒ’แƒ–แƒแƒ›แƒ™แƒ•แƒšแƒ”แƒ•แƒ˜ แƒกแƒแƒœแƒ“แƒ แƒ“แƒ แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก Bash แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก
Shell แƒคแƒแƒœแƒ˜ แƒ›แƒแƒœแƒแƒžแƒ˜แƒก แƒ›แƒ˜แƒ”แƒ 

bash แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒ แƒ—แƒ•แƒ แƒฐแƒ’แƒแƒ•แƒก แƒœแƒ”แƒ›แƒกแƒ˜แƒก แƒซแƒ˜แƒ”แƒ‘แƒแƒก แƒ—แƒ˜แƒ•แƒ˜แƒก แƒ’แƒ แƒแƒ•แƒแƒจแƒ˜, แƒ’แƒแƒœแƒกแƒแƒ™แƒฃแƒ—แƒ แƒ”แƒ‘แƒ˜แƒ— แƒ›แƒแƒจแƒ˜แƒœ, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒแƒฎแƒแƒšแƒ˜ แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ”แƒ‘แƒ˜ แƒฉแƒœแƒ“แƒ”แƒ‘แƒ แƒแƒ แƒกแƒ”แƒ‘แƒฃแƒš แƒ™แƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒ‘แƒแƒ–แƒแƒจแƒ˜ แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ˜แƒก, แƒญแƒ แƒ˜แƒกแƒ แƒ“แƒ แƒกแƒแƒ˜แƒ›แƒ”แƒ“แƒแƒแƒ‘แƒ˜แƒก แƒกแƒแƒ™แƒ˜แƒ—แƒฎแƒ”แƒ‘แƒ˜แƒก แƒ“แƒ แƒแƒฃแƒšแƒ˜ แƒ’แƒแƒœแƒฎแƒ˜แƒšแƒ•แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”. แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒแƒฆแƒ›แƒแƒฉแƒœแƒ“แƒ”แƒ— แƒแƒกแƒ”แƒ— แƒกแƒ˜แƒขแƒฃแƒแƒชแƒ˜แƒ”แƒ‘แƒจแƒ˜ แƒแƒœ แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜ แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒ, แƒแƒœ แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ”แƒ‘แƒ˜แƒก แƒ แƒ—แƒฃแƒšแƒ˜ แƒ’แƒ แƒแƒ•แƒ˜แƒก แƒ›แƒแƒ แƒ—แƒ•แƒ˜แƒกแƒแƒก.

แƒ’แƒฃแƒœแƒ“แƒ˜ Mail.ru Cloud Solutions แƒ—แƒแƒ แƒ’แƒ›แƒœแƒ แƒกแƒขแƒแƒขแƒ˜แƒ แƒ แƒ”แƒ™แƒแƒ›แƒ”แƒœแƒ“แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒ—, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ“แƒแƒ’แƒ”แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒแƒ— แƒ“แƒแƒฌแƒ”แƒ แƒแƒ—, แƒ’แƒแƒ›แƒแƒ แƒ—แƒแƒ— แƒ“แƒ แƒฃแƒ™แƒ”แƒ— แƒจแƒ”แƒ˜แƒœแƒแƒฎแƒแƒ— แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ”แƒ‘แƒ˜. แƒ“แƒแƒ˜แƒฏแƒ”แƒ แƒ”แƒ— แƒ—แƒฃ แƒแƒ แƒ, แƒแƒ แƒแƒคแƒ”แƒ แƒ˜ แƒแƒญแƒแƒ แƒ‘แƒ”แƒ‘แƒก แƒกแƒฃแƒคแƒ—แƒ, แƒ’แƒแƒ›แƒแƒกแƒแƒงแƒ”แƒœแƒ”แƒ‘แƒšแƒแƒ“ แƒ›แƒ–แƒ แƒ‘แƒแƒจ แƒ™แƒแƒ“แƒ˜แƒก แƒ“แƒแƒฌแƒ”แƒ แƒ˜แƒก แƒ™แƒ›แƒแƒงแƒแƒคแƒ˜แƒšแƒ”แƒ‘แƒแƒก, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก แƒงแƒแƒ•แƒ”แƒš แƒฏแƒ”แƒ แƒ–แƒ”.

แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ แƒแƒ•แƒขแƒแƒ แƒ˜ แƒ˜แƒ–แƒ˜แƒแƒ แƒ”แƒ‘แƒก แƒ˜แƒ›แƒแƒก, แƒ แƒแƒช แƒ›แƒแƒœ แƒ˜แƒกแƒฌแƒแƒ•แƒšแƒ แƒ‘แƒแƒšแƒ แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒฌแƒšแƒ˜แƒก แƒ’แƒแƒœแƒ›แƒแƒ•แƒšแƒแƒ‘แƒแƒจแƒ˜, แƒ˜แƒกแƒ”แƒ•แƒ” แƒ แƒแƒ’แƒแƒ แƒช แƒ–แƒแƒ’แƒ˜แƒ”แƒ แƒ— แƒ’แƒแƒ•แƒ แƒชแƒ”แƒšแƒ”แƒ‘แƒฃแƒš แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ”แƒ‘แƒก, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ›แƒแƒช แƒ˜แƒก แƒ’แƒแƒฃแƒคแƒ แƒ—แƒฎแƒ˜แƒšแƒ“แƒ. แƒ”แƒก แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒแƒœแƒ˜แƒ, แƒ แƒแƒ“แƒ’แƒแƒœ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒฃแƒšแƒ˜ แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒคแƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒ แƒจแƒ”แƒ›แƒฅแƒ›แƒœแƒ”แƒšแƒ˜, แƒ—แƒแƒ•แƒ˜แƒกแƒ˜ แƒ™แƒแƒ แƒ˜แƒ”แƒ แƒ˜แƒก แƒ’แƒแƒ แƒ™แƒ•แƒ”แƒฃแƒš แƒ›แƒแƒ›แƒ”แƒœแƒขแƒจแƒ˜, แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ”แƒ‘แƒ—แƒแƒœ แƒ แƒฃแƒขแƒ˜แƒœแƒฃแƒšแƒ˜ แƒกแƒแƒ›แƒฃแƒจแƒแƒ แƒแƒ›แƒแƒชแƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

แƒฎแƒแƒคแƒแƒœแƒ’แƒ˜แƒก แƒ“แƒแƒ›แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒšแƒ”แƒ‘แƒ˜

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 แƒแƒฆแƒ›แƒแƒแƒฉแƒ˜แƒœแƒแƒก แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ”แƒ‘แƒ˜ แƒ’แƒแƒœแƒ•แƒ˜แƒ—แƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒ“แƒ แƒแƒก

แƒฆแƒ˜แƒ แƒก แƒ›แƒกแƒ’แƒแƒ•แƒกแƒ˜ แƒ แƒแƒฆแƒแƒชแƒ˜แƒก แƒ˜แƒœแƒขแƒ”แƒ’แƒ แƒ˜แƒ แƒ”แƒ‘แƒ 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"

แƒ”แƒก แƒ›แƒ”แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ แƒแƒ›แƒแƒ•แƒ˜แƒชแƒœแƒ แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒฃแƒ แƒ˜/แƒœแƒ”แƒšแƒ˜ แƒกแƒคแƒ”แƒ แƒแƒ”แƒ‘แƒ˜ แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ”แƒ‘แƒจแƒ˜, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒกแƒแƒช แƒกแƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒแƒ— แƒแƒžแƒขแƒ˜แƒ›แƒ˜แƒ–แƒแƒชแƒ˜แƒ.

แƒ’แƒ˜แƒกแƒฃแƒ แƒ•แƒ”แƒ‘แƒ— แƒฌแƒแƒ แƒ›แƒแƒขแƒ”แƒ‘แƒแƒก!

แƒ™แƒ˜แƒ“แƒ”แƒ• แƒ แƒ แƒฌแƒแƒ˜แƒ™แƒ˜แƒ—แƒฎแƒแƒ—:

  1. แƒ’แƒแƒ“แƒแƒกแƒ•แƒšแƒ แƒ“แƒ GPU แƒฅแƒ”แƒจแƒ˜.
  2. แƒฆแƒแƒœแƒ˜แƒกแƒซแƒ˜แƒ”แƒ‘แƒแƒ–แƒ” แƒแƒ แƒ˜แƒ”แƒœแƒขแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ“แƒแƒคแƒฃแƒซแƒœแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ webhooks-แƒ–แƒ” Mail.ru Cloud Solutions-แƒ˜แƒก S3 แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ”แƒ‘แƒ˜แƒก แƒกแƒแƒชแƒแƒ•แƒจแƒ˜.
  3. แƒฉแƒ•แƒ”แƒœแƒ˜ แƒขแƒ”แƒšแƒ”แƒ’แƒ แƒแƒ›แƒ˜แƒก แƒแƒ แƒฎแƒ˜ แƒชแƒ˜แƒคแƒ แƒฃแƒšแƒ˜ แƒขแƒ แƒแƒœแƒกแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘.

แƒฌแƒงแƒแƒ แƒ: www.habr.com