भाग 1: केअरटेकरचा आवाज (हिरवा, 1–6) · भाग 2: रात्रपाळी (जांभळा, 7–12). प्रत्येक आकृती खरी गोष्ट आहे — terminal, फाइल्सचे झाड, permission bits, data असलेली pipeline, process चे झाड, cron ची ओळ — आणि प्रत्येकीखाली एक lab: आदेश चालवा, दारे टिक करा, pipe बांधा, घंटा दोनदा वाजवा. वर्तुळातले आकडे 1 → 2 → 3 या क्रमाने पहा.
1 🧹 Shell का
केअरटेकरचा आवाज — एक command, तिचे arguments, तिचे उत्तर आणि तिचा exit code; प्रत्येक server अजूनही ती का बोलतो.
🧒 सोप्या शब्दांत
कल्पना करा, तुम्ही शाळेच्या caretaker ला एक ओळ सांगता: 'वर्ग 3A ची यादी दाखवा'. तो यादी वाचून दाखवतो आणि मग एक आकडा दाखवतो: सगळे ठीक झाले तर 0, काही चुकले तर दुसरा आकडा. computer साठी shell हाच caretaker आहे. प्रत्येक server आणि CI robot अजूनही असेच आदेश घेतो, म्हणून याच ओळी script मध्ये साठवून उद्या पुन्हा चालवता येतात.
📖 नवे शब्दcommand — तुम्ही सांगितलेल्या कामाचे नाव, उदा. listflag — command ने काम कसे करावे हे सांगणारी जादा माहिती, उदा. --class 3Aexit code — शेवटी दाखवलेला आकडा: 0 म्हणजे ठीक, 1 ते 255 म्हणजे काहीतरी fail झालेscript — पुन्हा पुन्हा चालवता याव्यात म्हणून file मध्ये लिहिलेल्या shell च्या ओळी
⏪ आधी
shell शिवाय तुम्ही एकेक screen वर click करत बसता, आणि केलेले काम पुन्हा चालवता, script करता किंवा तपासता येत नाही.
💡 काय
shell म्हणजे एक ओळ ऐकणारा caretaker: command, त्याचे arguments आणि flags, आणि उत्तर म्हणून output व exit code.
⚙️ कसे
तुम्ही bin/school.sh list --class 3A टाइप करता; report stdout वर, log stderr वर जातो, आणि echo $? exit code 0 दाखवतो.
🎯 का
प्रत्येक server, container आणि CI runner अजूनही असेच आदेश घेतो; exit code 0 म्हणजे ठीक, 1 ते 255 म्हणजे नाही.
🚀 पुढे
पुढे तुम्ही इमारतीचा नकाशा शिकाल: files, paths आणि permissions, ज्यांना तुमचा प्रत्येक command स्पर्श करतो.
🧪 Try it here — केअरटेकरला आदेश द्या आणि तीन उत्तरे वाचा: अहवाल, नोंदवही, exit code
इमारतीचा नकाशा — absolute आणि relative paths, लपलेल्या फाइल्स, आणि rwx: कोणत्या खोलीत कोण जाऊ शकते.
🧒 सोप्या शब्दांत
फक्त 'खोली 5' म्हटले तर पाहुणा हरवू शकतो, पण पूर्ण पत्ता कुठूनही चालतो. प्रत्येक file ला असा पत्ता असतो, उदा. /home/you/school/data/register.csv. प्रत्येक खोलीला तीन प्रकारच्या चाव्या असतात: वाचणे, लिहिणे आणि आत जाणे. owner, group आणि बाकी सगळे यांना त्या वेगवेगळ्या दिल्या जातात, म्हणून तुमच्या गुप्त files तुमच्याच राहतात.
📖 नवे शब्दabsolute path — / पासून सुरू होणारा पूर्ण पत्ता; कोणत्याही folder मधून चालतोrelative path — तुम्ही आत्ता ज्या folder मध्ये आहात तिथून दिशा, उदा. data/register.csvrwx — read, write, execute: पाहणे, बदलणे, किंवा चालवणे (folder साठी आत जाणे)chmod — कोणाकडे कोणती चावी हे बदलणारा command; 600 म्हणजे फक्त तुम्ही
⏪ आधी
paths आणि permissions शिवाय file नीट सापडत नाही, आणि कोणीही तुमची secrets वाचू किंवा scripts बदलू शकतो.
💡 काय
प्रत्येक file चा / पासून एकच absolute पत्ता असतो, आणि rwx bits ठरवतात की कोण वाचू, लिहू किंवा खोलीत जाऊ शकतो.
⚙️ कसे
Mode 755 म्हणजे owner ला rwx (4+2+1=7) आणि group व others ला r-x (5); chmod 600 secret.env फक्त तुमच्यासाठी ठेवतो.
🎯 का
योग्य permissions अपघात आणि leaks थांबवतात: साध्या files ला 644, scripts ला 755, आणि सर्व दारे उघडी असलेले 777 कधीच नाही.
🚀 पुढे
HERE ठरवल्यावर script कोणत्याही folder मधून चालते; पुढच्या lessons मधील pipes आणि tools चा हाच पाया आहे.
🧪 Try it here — दारे टिक करा, mode वाचा — मग एका folder मधून relative path सोडवा
कॉरिडॉर — stdin, stdout, stderr; | · > · >> · 2>&1 · tee; अहवाल आणि नोंदवही कधीच मिसळत नाहीत.
🧒 सोप्या शब्दांत
शाळेच्या corridor मधील relay race आठवा: प्रत्येक धावपटू पुढच्याला baton देतो. shell मध्ये | हे चिन्ह एका command चा report पुढच्या command ला देते. प्रत्येक command ला आत येण्याचे एक दार आणि बाहेर जाण्याची दोन दारे असतात: एक स्वच्छ report साठी, एक तक्रारींसाठी. म्हणून पुढच्या धावपटूला फक्त स्वच्छ data मिळतो. चार छोटे commands मिळून '3A मध्ये किती मुले?' याचे उत्तर देतात.
📖 नवे शब्दstdin — दार 0: आत येणारे, keyboard मधून किंवा आधीच्या command कडूनstdout — दार 1: स्वच्छ reportstderr — दार 2: log आणि तक्रारी, report पासून वेगळ्या ठेवलेल्याpipe (|) — एका command चा report थेट पुढच्या command ला देतो> and >> — report file मध्ये पाठवतात: > file बदलून टाकतो, >> शेवटी जोडतो
⏪ आधी
redirection शिवाय reports आणि error messages एकाच screen वर मिसळतात, आणि एका tool चे output दुसरा वापरू शकत नाही.
💡 काय
प्रत्येक command ला तीन corridors असतात: आत येणारा stdin (0), report साठी stdout (1), आणि log साठी stderr (2).
⚙️ कसे
pipe त्यांना जोडतो: school.sh list | grep 3A | sort | wc -l सांगतो 3A मध्ये किती मुले आहेत; > आणि 2>&1 output वळवतात.
🎯 का
report आणि log कधीच मिसळत नसल्याने pipe ला नेहमी स्वच्छ data मिळतो, आणि छोटे tools मिळून मोठी उत्तरे देतात.
🚀 पुढे
पुढे text tools येतात, grep, sed, awk वगैरे, जे pipes ने जोडून तुम्ही कोणत्याही file ला प्रश्न विचारता.
🧪 Try it here — खऱ्या नोंदवहीवर pipeline बांधा आणि ओळी कमी होताना पहा
ऑफिस — grep, sed, awk, cut, sort, uniq, wc, tr: CSV म्हणून नोंदवही, आणि प्रश्नांची उत्तरे देणाऱ्या एक-ओळी.
🧒 सोप्या शब्दांत
शाळेचे register ही साधी text यादी आहे: प्रत्येक ओळीवर नाव, वर्ग आणि grade, स्वल्पविरामाने वेगळे. office कडे छोटे tools आहेत, प्रत्येक एकच काम करतो: एक ओळी शोधतो, एक column कापून काढतो, एक क्रमाने लावतो, एक मोजतो. त्यांना जोडा आणि एकाच ओळीत उत्तर मिळते: '3A मध्ये 3 मुले, 3B मध्ये 2', मोठा program न लिहिता.
📖 नवे शब्दCSV — text म्हणून साठवलेले table: प्रत्येक ओळीत एक row, columns स्वल्पविरामाने वेगळेgrep — तुम्ही सांगितलेला शब्द असलेल्या ओळीच ठेवतोcut — एकच column कापून काढतो, उदा. फक्त वर्गsort | uniq -c — सारख्या ओळी शेजारी आणतो, मग प्रत्येक गट मोजतोsed — प्रत्येक ओळीत text शोधून बदलतो, उदा. 3B ऐवजी 3C
⏪ आधी
text tools शिवाय CSV बद्दलच्या प्रत्येक छोट्या प्रश्नासाठी spreadsheet उघडावी लागते किंवा पूर्ण program लिहावा लागतो.
💡 काय
grep, sed, awk, cut, sort, uniq, wc आणि tr हे office चे छोटे tools आहेत; प्रत्येक text च्या ओळींवर एकच काम करतो.
⚙️ कसे
tail -n +2 register.csv | cut -d, -f2 | sort | uniq -c प्रत्येक वर्गातील मुले मोजतो: 3A मध्ये 3 आणि 3B मध्ये 2.
🎯 का
one-liners खरे प्रश्न काही seconds मध्ये सोडवतात; प्रश्न मोठा होईपर्यंत Python ची गरज नाही.
🚀 पुढे
register चा path सारख्या values scripts मध्ये पुन्हा वापरण्यासाठी पुढचा lesson variables आणि quoting आणतो.
🧪 Try it here — grep, awk आणि sed ने नोंदवहीला प्रश्न विचारा
नावाच्या पट्ट्या — $VAR, "$VAR", ${VAR:-default}, $(command); quotes नसलेली variables ही पहिल्या क्रमांकाची चूक का.
🧒 सोप्या शब्दांत
register चा पूर्ण पत्ता प्रत्येक वेळी लिहिण्याऐवजी तुम्ही त्यावर name tag लावता: REGISTER. आता $REGISTER म्हणजे तो पत्ता. पण Aishwarya Kumar या नावात space आहे, आणि quote चिन्हांशिवाय shell त्याचे दोन लोक करतो: Aishwarya आणि Kumar. double quotes मध्ये ठेवले की ते एकच राहते. हे quotes विसरणे हा shell मधला सर्वात सामान्य bug आहे.
📖 नवे शब्दvariable — value ठेवणारा name tag, उदा. REGISTER=data/register.csv$VAR — tag वर लिहिलेली value वाचा"$VAR" — value एकाच तुकड्यात राहते, त्यात spaces असल्या तरीexport — तुम्ही सुरू केलेल्या scripts ना सुद्धा tag दिसू देतो
⏪ आधी
variables शिवाय paths सगळीकडे पुन्हा लिहावे लागतात, आणि space असलेले unquoted नाव गुपचूप दोन arguments मध्ये तुटते.
💡 काय
variable म्हणजे REGISTER=data/register.csv सारखा name tag; $REGISTER ने वाचतात, आणि export तो child scripts ला दाखवतो.
⚙️ कसे
"$name" एकच argument राहतो, $name spaces वर तुटतो आणि glob होतो, आणि '$name' काहीही expand न होता तसाच text राहतो.
🎯 का
unquoted variables हा shell मधला नंबर एकचा bug आहे; नेहमी quote केल्याने चुकीच्या files delete किंवा वाचणे टळते.
🚀 पुढे
values variables मध्ये आल्यावर पुढच्या lesson मध्ये caretaker exit codes, if, case आणि loops वापरून निर्णय घेतो.
🧪 Try it here — मूल्यात spaces घाला आणि प्रत्येक लिखाणाने किती arguments होतात ते पहा
केअरटेकरचे निर्णय — exit codes, if आणि [[ ]], case, for आणि while, && आणि ||.
🧒 सोप्या शब्दांत
Zoya चे नाव register मध्ये लिहिण्याआधी caretaker तपासतो: ती आधीच आहे का? तपासणी exit code ने उत्तर देते, आणि 0 म्हणजे होय. होय असेल तर तो म्हणतो 'आधीच enrolled'; नाही तर तिचे नाव जोडतो. loop म्हणजे हजेरी घेण्यासारखे: यादीतील प्रत्येक नावासाठी तेच काम. यामुळे script काम करण्याआधी तपासू शकते.
📖 नवे शब्दif — तपासणीचे उत्तर 0 (म्हणजे होय) असेल तेव्हाच हे करा[[ ]] — प्रश्नाचा डबा: file आहे का? आकडा मोठा आहे का?&& and || — && पुढचे काम फक्त यश मिळाल्यावर चालवतो, || फक्त अपयशावरfor / while — प्रत्येक item साठी, किंवा काहीतरी खरे असेपर्यंत, तेच काम पुन्हा कराcase — शब्द जुळवून एक मार्ग निवडा, उदा. list किंवा enrol
⏪ आधी
conditions आणि loops शिवाय script तेच steps आंधळेपणाने चालवते, मूल आधीच enrolled असले तरीही.
💡 काय
caretaker exit codes वरून निर्णय घेतो: 0 म्हणजे होय, म्हणून if, &&, ||, case, for आणि while त्यांवरून फाटे घेतात.
⚙️ कसे
Zoya असल्यास grep -q "^Zoya," register.csv 0 देतो; [[ -f file ]] किंवा [[ $n -gt 3 ]] हे tests सुद्धा codes देतात.
🎯 का
booleans लागत नाहीत: fail झालेला grep हाच false branch आहे, त्यामुळे scripts सुरक्षितपणे skip, retry किंवा नकार देऊ शकतात.
🚀 पुढे
निर्णय जमल्यावर पुढचा lesson त्यांना functions आणि list, enrol सारख्या sub-commands मध्ये बांधतो.
🧪 Try it here — test चालवा, तिचा exit code वाचा — मग glob वर loop करा
पुन्हा वापरता येणाऱ्या दिनचर्या — functions, $1 $@ $#, local, एक main, sub-commands, header comment मधून --help.
🧒 सोप्या शब्दांत
caretaker नेहमी करायच्या प्रत्येक कामासाठी एक card ठेवतो: 'मुलांची यादी', 'मुलाचे नाव नोंदवा'. function म्हणजे नाव असलेले असे card: तुम्ही ते बोलावता आणि नाव किंवा वर्ग अशी माहिती देता. school.sh अशाच cards ने बनलेली आहे, आणि एक main card तुम्ही टाइप केलेला पहिला शब्द वाचून योग्य card निवडते. file च्या वरचा comment हाच --help page म्हणूनही काम करतो.
📖 नवे शब्दfunction — नाव असलेला steps चा संच, जो पुन्हा पुन्हा बोलावता येतो$1 $@ $# — दिलेली पहिली माहिती, सगळी माहिती, आणि ती किती आहेlocal — एकाच function च्या आत राहणारा variablesub-command — काम निवडणारा पहिला शब्द, उदा. list किंवा enrol
⏪ आधी
functions शिवाय एकच लांब script तोच code पुन्हा पुन्हा लिहिते, आणि ती कोणते arguments घेते हे कोणाला कळत नाही.
💡 काय
function म्हणजे पुन्हा वापरता येणारा routine; त्याचे स्वतःचे arguments $1, $@ आणि $# असतात, आणि local variables खाजगी ठेवतो.
⚙️ कसे
school.sh मध्ये shebang, set -euo pipefail, cmd_list आणि cmd_enrol, आणि main "$@" आहे ज्याचा case sub-command निवडतो.
🎯 का
header comment मधून --help छापणारा खऱ्या script चा आकार वाचायला, test करायला आणि दुसऱ्याला द्यायला सोपा असतो.
🚀 पुढे
पुढे fire drill: strict mode, trap आणि dry runs या script ला मोठ्याने fail करायला आणि स्वतः साफसफाई करायला लावतात.
🧪 Try it here — command line लिहा आणि $0, $1 … "$@" आणि $# वाचा — मग shift
आगीची तालीम — set -euo pipefail, trap, mktemp, dry runs, shellcheck; मोठ्याने नापास होणारी आणि आवरून घेणारी script.
🧒 सोप्या शब्दांत
fire drill मध्ये दार बंद असेल तर तुम्ही थांबून हाक मारता, चालत राहत नाही. बेफिकीर script मात्र चालत राहते: 'folder मध्ये जा' fail झाले तर पुढची ओळ 'इथले सगळे delete करा' चुकीच्या files पुसते. set -euo pipefail script ला पहिल्याच अपयशावर थांबवतो, आणि trap म्हणजे काहीही झाले तरी शेवटी दिवे बंद करून कुलूप लावणारे शिक्षक.
📖 नवे शब्दset -e — पहिला command fail झाला की script थांबवाset -u — चुकीचे लिहिलेले किंवा न ठरवलेले variable म्हणजे error, गुपचूप रिकामे नाहीpipefail — आतला कोणताही command fail झाला तर पूर्ण pipeline failtrap — शेवटी नेहमी चालणारी साफसफाई, Ctrl-C नंतर सुद्धाdry run — काय केले असते ते सांगा, प्रत्यक्ष न करता
⏪ आधी
safety शिवाय fail झालेला cd किंवा variable मधील typo मुळे rm -rf पुढे चालत राहतो आणि गुपचूप चुकीच्या files delete करतो.
💡 काय
set -euo pipefail म्हणजे strict mode: error वर थांबा, unset variables ला error माना, आणि pipe चा कोणताही भाग fail झाला तर pipe fail.
⚙️ कसे
trap … EXIT काहीही झाले तरी rm -f tmp; rmdir lock सारखी साफसफाई चालवतो, error किंवा Ctrl-C वर सुद्धा.
🎯 का
मोठ्याने fail होणाऱ्या आणि साफसफाई करणाऱ्या scripts अर्धवट काम सोडत नाहीत; DRY_RUN आणि shellcheck चुका आधीच पकडतात.
🚀 पुढे
पुढे तुम्ही इमारतीतील इतर processes आणि trap ज्या signals ऐकतो त्यांना भेटाल.
🧪 Try it here — switches बदला, नापास होणारी ओळ निवडा, script कुठे थांबते आणि trap काय आवरते ते पहा
इमारतीत कोण आहे — ps, kill आणि signals, & आणि wait, jobs, nohup, xargs -P; PID 1 आणि zombies.
🧒 सोप्या शब्दांत
शाळेच्या इमारतीतील प्रत्येकाकडे एक badge असतो: एक क्रमांक आणि त्याला कोणी आणले त्याचे नाव. चालू programs पण तसेच: प्रत्येकाला PID क्रमांक आणि एक parent असतो. एखाद्याला घरी पाठवायला announcement speaker वापरतात: TERM म्हणजे 'कृपया निघा', आधी आवराआवर करू देतो, तर KILL लगेच बाहेर काढतो, साफसफाईला वेळ नाही. docker stop आधी नम्रपणे सांगतो, 10 seconds थांबतो, मग KILL वापरतो.
📖 नवे शब्दprocess — आत्ता चालू असलेला programPID — process चा badge क्रमांक; PPID म्हणजे त्याच्या parent चा क्रमांकsignal — process ला छोटा निरोप, उदा. TERM (कृपया थांबा) किंवा KILL (आत्ताच थांबा)PID 1 — इमारतीचा प्रमुख: पहिला process, ज्याच्यापासून बाकीचे येतात& and wait — job background मध्ये सुरू करा, मग तो संपेपर्यंत थांबा
⏪ आधी
process tools शिवाय काय चालू आहे ते दिसत नाही, अडकलेला job नम्रपणे थांबवता येत नाही, किंवा काम parallel चालवता येत नाही.
💡 काय
प्रत्येक process ला PID, parent PPID आणि user असतो, आणि सगळे PID 1 (init किंवा container entrypoint) खालील एका tree मध्ये असतात.
⚙️ कसे
ps आणि pgrep school.sh ला 4055 म्हणून शोधतात; kill -TERM थांबायला सांगतो म्हणजे trap साफसफाई करू शकतो, kill -KILL लगेच संपवतो.
🎯 का
docker stop आधी TERM पाठवतो, 10 s थांबतो, मग KILL; म्हणून TERM trap करणारी script अचानक तुटण्याऐवजी नीट बंद होते.
🚀 पुढे
background jobs समजल्यावर पुढच्या lesson मध्ये cron ची घंटा त्यांना वेळापत्रकानुसार सुरू करते.
🧪 Try it here — चालू script ला signals पाठवा आणि काय होते ते पहा — मग एका वेळी चार चालवा
घंटा — cron, systemd timers, lock फाइल्स, logs, idempotent runs; एकाच वेळी दोनदा कधीच न चालणारा रात्रीचा backup.
🧒 सोप्या शब्दांत
शाळेची घंटा कोणी न दाबता ठरलेल्या वेळी वाजते. computer साठी cron ही घंटा आहे: '0 2 * * *' ही ओळ म्हणजे 'रोज रात्री 02:00 ला backup चालवा'. दोन backups एकाच वेळी चालू नयेत म्हणून पहिला backup एक lock folder बनवतो; दुसऱ्याला तो आधीच दिसतो आणि तो थांबतो. आणि job दोनदा चालला तरी जादा नुकसान कधीच होऊ नये.
📖 नवे शब्दcron — ठरलेल्या वेळी commands चालवणारी अंगभूत घंटाcron line — वेळेचे पाच fields (minute hour day month weekday), मग commandlock — 'इथे कोणी काम करत आहे' ची पाटी, म्हणजे एका वेळी एकच runidempotent — पुन्हा चालवले तरी तोच निकाल, दुप्पट नुकसान नाही
⏪ आधी
scheduling शिवाय कोणालातरी रोज रात्री हाताने backup चालवायचे लक्षात ठेवावे लागते, आणि दोन runs एकमेकांना धडकू शकतात.
💡 काय
cron ही घंटा आहे: पाच fields ची एक ओळ, minute hour day month weekday, आणि मग चालवायचा command.
⚙️ कसे
0 2 * * * /srv/school/bin/backup.sh रोज रात्री 02:00 ला चालतो, आणि mkdir lock एका वेळी एकच run चालेल याची खात्री करतो.
🎯 का
mkdir atomic असल्याने आणि runs idempotent असल्याने nightly backup एकाच वेळी दोनदा चालत नाही आणि पुन्हा चालवल्यास नुकसान करत नाही.
🚀 पुढे
cron ला PATH नसतो आणि तुम्हीही नसता; हे तुम्हाला CI आणि containers साठी तयार करते, जिथे तुमच्या scripts पुढे चालतात.
🧪 Try it here — cron ची ओळ लिहा, शब्दांत वाचा, पुढच्या तीन घंटा पहा — मग दोनदा वाजवा
मेलरूममधला केअरटेकर — shebangs, bash विरुद्ध POSIX sh, entrypoints, env आणि गुपिते, करार म्हणून exit codes.
🧒 सोप्या शब्दांत
पत्र पोस्ट करताना तुम्ही post office मध्ये उभे राहत नाही; ते पोहोचले की नाही हे नंतर कळते. CI तुमची script दूरच्या computer वर चालवते, जिथे screen नाही आणि प्रश्नांना उत्तर द्यायला कोणी नाही; ती फक्त exit code वाचते: 0 म्हणजे check हिरवा, बाकी काहीही म्हणजे लाल. container मध्ये settings आणि secrets environment values म्हणून येतात, आणि exec खऱ्या program ला जागा देतो म्हणून थांबण्याचे signals त्याच्यापर्यंत पोहोचतात.
📖 नवे शब्दCI — प्रत्येक push वर तुमचे tests चालवून हिरवा किंवा लाल दाखवणारा robotcontainer — program आणि त्याला लागणारे सगळे घेऊन जाणारा बंद डबाentrypoint — container सुरू झाल्यावर चालणारी पहिली scriptenv variable — बाहेरून दिलेली setting, उदा. PORT=3000exec — script च्या जागी खरा program आणा, म्हणजे तो PID 1 होतो
⏪ आधी
स्पष्ट contract शिवाय तुमच्या machine वर चालणारी script वेगळ्या PATH आणि HOME असलेल्या CI किंवा container मध्ये fail होते.
💡 काय
CI आणि containers मध्ये terminal नाही, prompts नाहीत, आणि exit code हाच एकमेव निकाल कोणी वाचतो.
⚙️ कसे
runner bash tests/run_tests.sh चालवतो: exit 0 हिरवा, exit 1 लाल; entrypoint ${PORT:=3000} ठरवून मग exec "$@" करतो.
🎯 का
exec मुळे खरा program PID 1 होतो म्हणून signals त्याच्यापर्यंत पोहोचतात, आणि settings व secrets prompts ऐवजी env मधून येतात.
🚀 पुढे
CI/CD school हे tests प्रत्येक push वर चालवते, आणि पुढचा lesson scripts ना debug आणि test कसे करायचे ते दाखवतो.
🧪 Try it here — base image, shebang आणि exit code निवडा — मेलरूम काय म्हणते ते वाचा
bash -x, PS4, shellcheck, ~30 ओळींच्या bash मधला test runner — आणि कळस-प्रकल्प: backup, तपासलेला.
🧒 सोप्या शब्दांत
विज्ञानाचा प्रयोग चुकला की तुम्ही तो हळू हळू पुन्हा करता आणि प्रत्येक पायरी लिहून ठेवता. bash -x script साठी हेच करतो: प्रत्येक command जसा चालला तसाच, ओळ क्रमांकासह, छापतो, म्हणून अंदाज न लावता कुठे बिघडले ते दिसते. मग एक छोटा test runner 14 प्रश्नांच्या checklist सारखा काम करतो, प्रत्येकावर pass किंवा fail लावतो, म्हणजे एक भाग दुरुस्त करताना दुसरा गुपचूप तुटत नाही.
📖 नवे शब्दbash -x — script चालवताना ती चालवत असलेला प्रत्येक command छापाPS4 — trace केलेल्या प्रत्येक ओळीपुढे छापले जाणारे लेबल, उदा. ओळ क्रमांकshellcheck — तुमची script वाचून सामान्य चुकांबद्दल इशारा देणारा checkertest runner — प्रत्येक check चालवून pass किंवा fail सांगणारी script
⏪ आधी
debugging tools शिवाय script का fail झाली याचा अंदाज लावत बसता, आणि tests शिवाय एखादा fix गुपचूप enrol किंवा backup तोडू शकतो.
💡 काय
bash -x प्रत्येक command shell ने खरोखर जसा चालवला तसा छापतो, आणि एक छोटा test runner प्रत्येक वर्तन तपासतो.
⚙️ कसे
PS4='+ ${LINENO}: ' bash -x ओळ क्रमांक जोडतो, आणि check "name" "wanted" "$(cmd)" ~30 ओळींच्या bash मध्ये 14 checks चालवतो.
🎯 का
"enrol twice is idempotent" सारखा fail होणारा check nightly backup पर्यंत पोहोचण्याआधीच नेमका bug दाखवतो.
🚀 पुढे
हा tested backup हा capstone आहे, आणि खऱ्या teams मध्ये CI प्रत्येक push वर हाच runner चालवते.
🧪 Try it here — bug घाला, 14 checks चालवा, runner वाचा — आणि एक command bash -x ने trace करा