Bash Scripting Best Practices: A Quick Guide to reliable and Performance Bash Scripts

Bash Scripting Best Practices: A Quick Guide to reliable and Performance Bash Scripts
Shells wallpaper by manapi

Litterae verissimae debugging est quasi acum in faeneato quaerere, praesertim cum novae additiones in codice existente existente sine opportune consideratione constitutionum structurarum, logificationis et firmitatis apparent. Talibus in adiunctis te invenire potes vel propter errata tua vel cum incomplexis scriptorum strues administrandis.

bigas Mail.ru Cloud Solutions interpretatus est articulus cum commendatione quae proderit ad te scribere, debug et scripta tua melius conservare. Crede vel non, nihil satisfactionem verberat scripturae mundae, paratae utendi bash codici qui omni tempore operatur.

In articulo, auctor communicat id quod per hosce annos didicit, ac quaedam errata communia quae eum custodiae deprehenderunt. Hoc magni momenti est quod omnis elit luctus, in aliquo loco in cursu suo, cum scriptoribus operatur in exercitatione automate operis opera.

Captionem tracto

Pleraque scripta verissima numquam invenimus mechanismo efficaci tersus cum aliquid inopinatum accidit in executione scriptionis.

Admiratio extrinsecus oriri potest, ut signum recipiat a nucleo. Talibus tractandis casibus maximi momenti est curare ut scripta satis certa sint ad systemata productionis persequendum. Saepe tracto exitus utuntur ut missionibus sic respondeant:

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 Testa aedificata est in imperio qui munus tersus tersus subcriptio adiuvat quod in casu alicuius significationis appellatur. Specialis autem cura adhibenda est cum tracto ut SIGINTqui facit litteras abort.

Praeterea, in pluribus tantum capere debes EXITsed notio est quod actu scriptionis mores pro unoquoque signo cognoscere potes.

Inaedificata munera paro - terminatio in errore celeriter

Magni momenti est ut statim occurrant et errori respondeant et exsecutionem cito desinant. Nihil gravius ​​esse potest, quam ut hoc praeceptum currere pergant;

rm -rf ${directory_name}/*

Lorem quod variabilis directory_name non constituta.

Praestat ut aedificatis in muneribus ut missiones tractandas setut set -o errexit, set -o pipefail aut set -o nounset in initio script. Hae functiones curare ut scriptura tua exibit quam primum in aliquo codice non-nulla exitu, usu indeterminatae variabilium, mandatorum invalidorum per tibiam transiit, et sic porro:

#!/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

Note: constructum- in munera ut set -o errexit, scripturam quam primum reditus "rudis" est (praeter nulla). Melius est ergo consuetudo erroris tractationem inducere, ut:

#!/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

Scripta scripta hoc modo cogit te diligentiorem esse de moribus omnium mandatorum scriptorum et praevenire facultatem erroris antequam te opprimat.

ShellCheck ad deprehendere errores in progressionem

Est aliquid simile dignum integrating ShellCheck in evolutione tua et fistulas tentans ad reprimendam tuam bash codicem contra optimas praxis.

Eo in ambitu locali meo utor ut relationes de syntaxi, semanticis et nonnullis erroribus in codice reperias, quos in enucleando desiderari potui. Haec analysis static est instrumentum pro litteris tuis verecundis et eo utendo valde commendo.

Utens tuo exitus Codes

Codices in POSIX redire non solum nulla vel nulla, sed nulla vel non nulla. His notis utere ut reditus consuetudo in codicibus errorum (inter 201-254) pro variis errorum casibus utatur.

Haec informationes tunc possunt ab aliis scriptoribus adhiberi quae tuum involvunt ad intellegendum quid erroris genus obvenerit et sic agere possit:

#!/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
}

Note: Diligenter quaeso fac cum nominibus variabilibus quae definis vitare casus earundem variabilium ambituum.

Munera Logging

Pulchra et structa colligatio magni momenti est ut eventus scripti tui facile cognoscant. Sicut cum aliis linguis programmandi summus gradus, functiones colligationes patrias semper utor in scriptis meis verecundis, sicut __msg_info, __msg_error et ita in.

Hoc adiuvat ut compagem logificationis normatum praebeat, mutando in uno tantum loco;

#!/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"

Solet experiri mechanismum habere in scriptis meis __init, ubi talis variabilis logger et aliae variabiles systematis initiales sunt vel ad valores default positi. Hae variabiles etiam ex praefectura optionum rectarum per scripturam invocationem constitui possunt.

Puta aliquid simile;

$ ./run-script.sh --debug

Cum tale scriptum exsecutum est, efficit ut ambitus systematis amplis constituantur ad valores defectus, si exigantur, vel saltem initiali ad aliquid opportunum, si opus sit, constituantur.

Electionem soleo inponere quid initialize et quid non facere in commercio inter usoris interfaciem et singula figurarum quas utens inire possit.

Architecture ad reuse et munda ratio civitatis

Modular / reusable code

β”œβ”€β”€ framework
β”‚   β”œβ”€β”€ common
β”‚   β”‚   β”œβ”€β”€ loggers.sh
β”‚   β”‚   β”œβ”€β”€ mail_reports.sh
β”‚   β”‚   └── slack_reports.sh
β”‚   └── daily_database_operation.sh

Repositorium separatum teneo quod ad novum project/bash scriptum quod evolvere cupimus, ad initialize uti possum. Quidquid reddi potest, in reposito reponi potest et ab aliis inceptis quae uti illa functione velint. Incepta ordinandi hoc modo significanter magnitudinem aliorum scriptorum minuit ac etiam efficit ut basis signum parvum sit ac facile ad probandum.

Ut in exemplo supra, omnes functiones colligationis sicut __msg_info, __msg_error alii, ut Retrahula tradit, separatim continentur common/* et dynamically coniungere in aliis missionibus sicut daily_database_operation.sh.

Relinquere post mundum ratio

Si facultates quasvis onerantes dum scriptum currit, suadetur ut omnia huiusmodi notitia in communi presul cum nomine temere congreget, e.g. /tmp/AlRhYbD97/*. Generantibus temere textum uti potes ut nomen indicem deligeres:

rand_dir_name="$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 16 | head -n 1)"

Peracto opere, tersus talium directoriorum praeberi potest in tracto hamo de quibus supra. Si directoria temporalia non custodita sunt, cumulant et in aliquo statu causant problematum inopinatum super exercitum, sicut orbis plenus.

Per cincinno files

Saepe opus est ut una tantum instantia scriptionis in quovis tempore hospitio curritur. Hoc fieri potest utens cincinnis files.

Ut plerumque cincinno files creo in /tmp/project_name/*.lock et ceptum eorum in principio scripti. Hoc iuvat scriptione eleganter terminare et inopinatas mutationes ad statum systematis alterius scripti paralleli currentis vitare. Lima clausa non sunt necessaria, si idem scriptum ad perficiendum in data hospitis parallela indiges.

Metimur et amplio

Saepe opus est cum scriptis quae per multa temporis spatia percurrunt, sicut cottidianae operationes database. Tales operationes typice involvunt ordinem graduum: notitias onerantium, anomalias reprimens, notitias importans, status relationes mittens, et sic porro.

In talibus casibus semper conor scripturam frangere in parvas scripturas separatas et eorum statum et executionem temporis utentem referre;

time source "${filepath}" "${args}">> "${LOG_DIR}/RUN_LOG" 2>&1

Postea tempus exsecutionis videre possum cum:

tac "${LOG_DIR}/RUN_LOG.txt" | grep -m1 "real"

Hoc me adiuvat ut problemati/tardi areis in scriptoribus egent qui optimisation egent.

Fortuna!

Quid est aliud legere;

  1. Ite et thesauros GPU.
  2. Exemplum applicationis eventus agitatae secundum telas in S3 repositionis repositionis Mail.ru Cloud Solutiones.
  3. Nostra canalis telegraphum de transformatione digitali.

Source: www.habr.com