Linux कमांड लाइन और Bash स्क्रिप्टिंग में महारत · पाठ

set -euo pipefail के साथ सख्त मोड

विफलता पर तुरंत रुकने का व्यवहार सक्षम करें और समझें कि सख्त-मोड का प्रत्येक फ़्लैग किन त्रुटियों को पकड़ता है और किन्हें नहीं।

पाठ 1, कुल 4 में से13 चरण

set -euo pipefail के साथ सख्त मोड, CoddyKit पर Linux कमांड लाइन और Bash स्क्रिप्टिंग में महारत का एक निःशुल्क पाठ है। यह 4 में से 1वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Linux कमांड लाइन और Bash स्क्रिप्टिंग में महारत सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Linux कमांड लाइन और Bash स्क्रिप्टिंग में महारत पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

Bash डिफ़ॉल्ट रूप से चुपचाप क्यों विफल होता है

डिफ़ॉल्ट रूप से, कमांड विफल होने पर भी Bash चलता रहता है। इससे उत्पादन स्क्रिप्ट में सूक्ष्म और कठिनाई से खोजी जा सकने वाली गंभीर समस्याएँ पैदा होती हैं।

इस स्क्रिप्ट पर विचार करें, जो बैकअप बनाने का प्रयास करती है:

  • पथ में टाइपो के कारण cp विफल हो जाता है
  • Bash इस विफलता को अनदेखा करके आगे बढ़ता रहता है
  • डेटा का बैकअप न बनने के बावजूद स्क्रिप्ट सफलता की सूचना देती है

यही चुपचाप विफल होने की समस्या है। सख्त मोड इसे हल करता है और Bash को किसी संकलित भाषा की तरह व्यवहार कराता है: कुछ गलत होते ही तुरंत रुक जाता है।

#!/usr/bin/env bash
# Without strict mode — dangerous default behavior

cp /important/data /backups/data   # fails (path doesn't exist)
echo "Backup complete"              # still prints — false confidence!
rm -rf /tmp/staging                # still runs — potentially destructive

तीन मुख्य फ़्लैग: set -euo pipefail

हर स्क्रिप्ट के आरंभ के पास यह पंक्ति रखकर सख्त मोड सक्षम किया जाता है:

set -euo pipefail

यह तीन अलग-अलग सुरक्षा उपाय सक्रिय करता है:

  • -e — किसी भी कमांड द्वारा शून्येतर स्थिति लौटाने पर तुरंत बाहर निकलें
  • -u — परिभाषित न किए गए चरों को त्रुटि मानें (खाली स्ट्रिंग में विस्तारित करने के बजाय)
  • -o pipefail — पाइपलाइन में अंतिम कमांड ही नहीं, बल्कि कोई भी कमांड विफल होने पर पाइपलाइन विफल मानी जाए

मिलकर ये गंभीर Bash स्क्रिप्ट के लिए मानक रक्षात्मक शीर्षलेख बनाते हैं। प्रत्येक फ़्लैग अलग प्रकार की बग पकड़ता है।

#!/usr/bin/env bash
set -euo pipefail

echo "Strict mode is now active"
echo "Every command failure will abort the script"

set -e (errexit) को समझना

set -e (जिसे set -o errexit भी लिखा जाता है) किसी कमांड के शून्येतर स्थिति के साथ बाहर निकलने पर स्क्रिप्ट को तुरंत बंद कर देता है।

जानने योग्य मुख्य व्यवहार:

  • सरल कमांड: false, grep pattern file (कोई मिलान नहीं), ls /nonexistent — ये सभी बाहर निकलने को सक्रिय करते हैं
  • स्क्रिप्ट में अंतिम कमांड का निकास कोड ही स्क्रिप्ट का निकास कोड बन जाता है
  • if की शर्तों में मौजूद कमांड अपवाद हैं — -e जाँच अभिव्यक्ति के लिए सक्रिय नहीं होता
  • || true के बाद आने वाले कमांड भी अपवाद हैं (अगले दृश्यों में देखें)

-e को विफलता के बाद चुपचाप आगे बढ़ने से बचाने वाली अपनी पहली सुरक्षा-पंक्ति समझें।

#!/usr/bin/env bash
set -e

echo "Before failure"
ls /this/path/does/not/exist   # exits here with code 2
echo "This line never runs"

set -u (nounset) को समझना

set -u (जिसे set -o nounset भी लिखा जाता है) Bash को परिभाषित न किए गए चर के किसी भी संदर्भ को घातक त्रुटि मानने पर मजबूर करता है।

-u के बिना, $FILENAME की जगह $FLENAME जैसी टाइपो चुपचाप खाली स्ट्रिंग में विस्तारित हो जाती है, जिससे कमांड अप्रत्याशित या खतरनाक ढंग से व्यवहार कर सकते हैं (कल्पना करें कि $TMPDIR परिभाषित न होने पर rm -rf "$TMPDIR/" चलाया जाए)।

महत्वपूर्ण अपवाद:

  • ${VAR:-default} — सुरक्षित डिफ़ॉल्ट प्रतिस्थापन, -u को सक्रिय नहीं करता
  • ${VAR:+value} — सशर्त विस्तार, यह भी सुरक्षित है
  • कोई स्थितीय आर्ग्युमेंट न दिए जाने पर "$@" और "$*" अपवाद हैं
#!/usr/bin/env bash
set -euo pipefail

# Safe: provide a default for optional vars
OUTPUT_DIR="${1:-/tmp/output}"
LOG_LEVEL="${LOG_LEVEL:-info}"

echo "Writing to: $OUTPUT_DIR"
echo "Log level: $LOG_LEVEL"

# This would abort the script:
# echo "$UNDEFINED_VAR"   # bash: UNDEFINED_VAR: unbound variable

-o pipefail को समझना

pipefail के बिना, पाइपलाइन की निकास स्थिति केवल अंतिम कमांड से तय होती है। पहले की विफलताएँ चुपचाप दब जाती हैं।

pipefail के बिना उदाहरण:

  • cat /missing/file | wc -l
  • cat निकास कोड 1 के साथ विफल होता है, लेकिन wc -l कोड 0 के साथ सफल होता है
  • पाइपलाइन 0 लौटाती है — सफलता! जबकि डेटा खो चुका है।

pipefail सक्षम होने पर Bash विफल होने वाली सबसे दाईं कमांड का निकास कोड लौटाता है। इससे पाइपलाइन की विफलताएँ दिखाई देती हैं और पकड़ी जा सकती हैं।

ध्यान दें: pipefail कोई अक्षर फ़्लैग नहीं है — इसे -o pipefail के साथ सेट करना होता है।

#!/usr/bin/env bash
set -euo pipefail

# With pipefail: this aborts if grep finds nothing (exit 1)
# grep returns 1 when no match found
ps aux | grep "[n]ginx" | awk '{print $2}'

echo "If we reach here, nginx is running"

जानबूझकर कमांड विफल करना — || true का उपयोग

कभी-कभी किसी कमांड को विफल होने की अनुमति होती है। set -e के साथ आपको स्वीकार्य विफलताओं को स्पष्ट रूप से बताना होगा; अन्यथा स्क्रिप्ट रुक जाएगी।

प्रचलित समाधान || true है, जो हमेशा सफल होने वाला फ़ॉलबैक जोड़ता है:

  • command || true — विफलता को पूरी तरह अनदेखा करें
  • command || echo "Warning: step failed, continuing" — चेतावनी दर्ज करें और आगे बढ़ें
  • command || { echo "fatal"; exit 1; } — विफलता का कस्टम प्रबंधन

यह पैटर्न कोड में आपका इरादा स्पष्ट करता है: साधारण कमांड का अर्थ है "यह सफल होना ही चाहिए"; || true का अर्थ है "यह विफल हो सकता है और यह ठीक है"।

#!/usr/bin/env bash
set -euo pipefail

# Remove temp dir if it exists — OK if it doesn't
rm -rf /tmp/my_workspace || true
mkdir -p /tmp/my_workspace

# Check if a service is running — OK if not
if systemctl is-active --quiet nginx 2>/dev/null || true; then
  echo "nginx is active"
fi

# Grep that may find nothing — OK
grep 'ERROR' /var/log/app.log || true

echo "Done"

set -e किन विफलताओं को नहीं पकड़ता

set -e में कुछ प्रसिद्ध अपवाद और कमियाँ हैं। इन्हें समझने से झूठा आत्मविश्वास नहीं होता:

  • if / while / until की शर्तों में मौजूद कमांड — डिज़ाइन के अनुसार जाँच अभिव्यक्ति अपवाद है
  • ! से निषेध किए गए कमांड — ! false बाहर निकलने को सक्रिय नहीं करता
  • || से ठीक पहले वाला अंतिम कमांड — जैसे false || handle_error
  • कुछ संदर्भों में सबशेल की निकास स्थिति — जैसे कुछ Bash संस्करणों में VAR=$(failing_command)
  • फ़ंक्शन के लौटाए गए मान — केवल फ़ंक्शन में अंतिम कमांड की गणना होती है

सख्त मोड स्पष्ट त्रुटि-जाँच का विकल्प नहीं है — यह एक सुरक्षा-जाल है, जो अधिकांश आकस्मिक विफलताओं को पकड़ता है।

#!/usr/bin/env bash
set -euo pipefail

# These do NOT trigger -e:
if false; then echo "never"; fi         # -e exempt in conditions
! false                                  # negation exempts
false || echo "handled"                 # || exempts the left side

# This DOES trigger -e (no condition, no ||):
# false

echo "Script continues after exempted failures"

सख्त मोड के साथ सबशेल और फ़ंक्शन

सख्त मोड की सेटिंग सबशेल में विरासत में मिलती हैं, लेकिन फ़ंक्शन और कमांड प्रतिस्थापन में उनका व्यवहार सूक्ष्म रूप से अलग होता है।

मुख्य नियम:

  • फ़ंक्शन कॉल करने वाले शेल से -e, -u, और pipefail विरासत में लेते हैं
  • फ़ंक्शन का शून्येतर रिटर्न कॉल करने वाले शेल को बाहर निकलने पर मजबूर करता है (जब -e सेट हो) — जब तक कॉल किसी शर्त में या || के बाद न हो
  • कमांड प्रतिस्थापन $(): पुराने Bash में, $() के अंदर विफल कमांड पैरेंट में -e को सक्रिय नहीं कर सकता; सुरक्षित रहने के लिए पहले असाइन करें, फिर अलग से उपयोग करें
  • स्पष्ट सबशेल () सभी फ़्लैग विरासत में लेते हैं
#!/usr/bin/env bash
set -euo pipefail

setup_workspace() {
  local dir="$1"
  mkdir -p "$dir"          # fails here if permissions denied
  cd "$dir"
  echo "Ready in $(pwd)"
}

# Safe pattern: assign result then use it
TODAY=$(date +%Y-%m-%d)   # capture separately
WORKDIR="/tmp/run_${TODAY}"

setup_workspace "$WORKDIR"
echo "Workspace: $WORKDIR"

सख्त मोड को त्रुटि ट्रैपिंग के साथ मिलाना

सख्त मोड Bash को बताता है कि कब रुकना है। ERR पर लगाया गया trap स्क्रिप्ट के बाहर निकलने से पहले सफ़ाई या निदान चला सकता है।

सामान्य पैटर्न है:

  • आरंभ में सख्त मोड सेट करें
  • cleanup या on_error फ़ंक्शन परिभाषित करें
  • इसे trap 'on_error' ERR से पंजीकृत करें
  • सफलता या विफलता की परवाह किए बिना सुनिश्चित सफ़ाई के लिए वैकल्पिक रूप से EXIT पर भी ट्रैप लगाएँ

महत्वपूर्ण: set -E (बड़ा E, जिसे errtrace भी कहा जाता है) का उपयोग करें, ताकि ERR ट्रैप फ़ंक्शन और सबशेल में भी विरासत में मिले — इसके बिना ट्रैप केवल मुख्य शेल बॉडी में सक्रिय होते हैं।

#!/usr/bin/env bash
set -Eeuo pipefail

on_error() {
  local exit_code=$?
  local line_number=${BASH_LINENO[0]}
  echo "ERROR: command failed with code ${exit_code} at line ${line_number}" >&2
}

cleanup() {
  echo "Cleaning up temporary files..." >&2
  rm -rf /tmp/my_run_dir 2>/dev/null || true
}

trap on_error ERR
trap cleanup EXIT

mkdir -p /tmp/my_run_dir
echo "hello" > /tmp/my_run_dir/output.txt
cat /tmp/my_run_dir/output.txt
echo "Done"

स्थानीय रूप से सख्त मोड अक्षम करना

कभी-कभी कोड का कोई खंड जानबूझकर "अव्यवस्थित" होता है — उदाहरण के लिए, वैकल्पिक टूल की जाँच करना या ऐसी पुरानी कमांड चलाना जो गैर-त्रुटि कारणों से शून्येतर मान लौटाती हैं। आप अस्थायी रूप से सख्त मोड अक्षम करके बाद में उसे पुनर्स्थापित कर सकते हैं।

सुरक्षित पैटर्न:

  • set +e से स्थिति सहेजें (-e अक्षम करता है), खंड चलाएँ, फिर set -e से इसे फिर सक्षम करें
  • या सबशेल ( set +e; ... ) का उपयोग करें, ताकि पैरेंट शेल के फ़्लैग कभी प्रभावित न हों
  • जोखिम वाले खंड के समाप्त होते ही फ़्लैग फिर से सक्षम करें — फ़्लैग बंद छोड़ना बग का सामान्य स्रोत है

जब खंड में कई कमांड हों, तो सबशेल वाला रूप पसंद करें, क्योंकि बाहर निकलते समय यह फ़्लैग अपने-आप पुनर्स्थापित कर देता है।

#!/usr/bin/env bash
set -euo pipefail

# Probe for optional tools without aborting
HAS_JQ=false
(
  set +e
  command -v jq > /dev/null 2>&1
  [[ $? -eq 0 ]] && echo "jq_found"
) && HAS_JQ=true || true

if [[ "$HAS_JQ" == "true" ]]; then
  echo "jq is available — using JSON output"
else
  echo "jq not found — using plain text"
fi

सख्त मोड वाली संपूर्ण स्क्रिप्ट का साँचा

यह उत्पादन के लिए तैयार साँचा है, जिसमें इस पाठ में सिखाई गई सख्त मोड की सभी सर्वोत्तम प्रक्रियाएँ शामिल हैं:

  • set -Eeuo pipefail — errtrace सहित सभी चार फ़्लैग
  • IFS=$'\n\t' — अधिक सुरक्षित शब्द-विभाजन (रिक्त स्थानों पर विभाजन से बचाता है)
  • निदान और सफ़ाई के लिए ERR + EXIT ट्रैप
  • वैकल्पिक पैरामीटर के लिए स्पष्ट डिफ़ॉल्ट मान
  • चर का दायरा सीमित करने के लिए readonly और local

विफलता पर तुरंत रुकने वाले व्यवहार और पता लगाने योग्य त्रुटियों का लाभ लेने के लिए इस साँचे को हर गैर-साधारण Bash स्क्रिप्ट की शुरुआत में कॉपी करें।

#!/usr/bin/env bash
set -Eeuo pipefail
IFS=$'\n\t'

# ── Constants ────────────────────────────────────────────
readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
readonly SCRIPT_NAME="$(basename "$0")"

# ── Trap handlers ────────────────────────────────────────
err_handler() {
  echo "[${SCRIPT_NAME}] ERROR on line ${BASH_LINENO[0]}: exit ${?}" >&2
}
cleanup() {
  echo "[${SCRIPT_NAME}] Exiting" >&2
}
trap err_handler ERR
trap cleanup EXIT

# ── Defaults ─────────────────────────────────────────────
ENV="${1:-production}"
MAX_RETRIES="${MAX_RETRIES:-3}"

# ── Main ─────────────────────────────────────────────────
main() {
  echo "Running in env=${ENV}, max_retries=${MAX_RETRIES}"
  echo "Script dir: ${SCRIPT_DIR}"
}

main "$@"

ज्ञान जाँच: pipefail का व्यवहार

जाँचिए कि pipefail पाइपलाइन के निकास कोड को कैसे प्रभावित करता है।

पुनरावृत्ति: set -euo pipefail के साथ सख्त मोड

इस पाठ में आपने सीखा कि सख्त मोड का उपयोग करके Bash स्क्रिप्ट को तुरंत और स्पष्ट रूप से विफल कैसे कराया जाता है।

तीन फ़्लैग और वे किससे सुरक्षा देते हैं:

  • -e (errexit) — किसी भी गैर-शून्य कमांड स्थिति पर बाहर निकलता है; शर्तों और || के बाद यह अपवादित रहता है
  • -u (nounset) — अनसेट वैरिएबल के संदर्भ मिलने पर रुक जाता है; वैकल्पिक वैरिएबल के लिए ${VAR:-default} का उपयोग करें
  • -o pipefail — अंतिम चरण ही नहीं, बल्कि किसी भी चरण के विफल होने पर पूरी पाइपलाइन को विफल बनाता है

पूरक अभ्यास:

  • -E (errtrace) जोड़ें, ताकि ERR ट्रैप फ़ंक्शन में भी प्रसारित हो
  • निदान और सफ़ाई के लिए ERR और EXIT पर trap का उपयोग करें
  • विफलताओं को जानबूझकर स्वीकार करने के लिए || true का उपयोग करें
  • पुराने या जाँच संबंधी कोड के लिए सबशेल में set +e द्वारा इसे अस्थायी रूप से बंद करें

सख्त मोड कोई अचूक उपाय नहीं है — इसके अपवादों को समझना आवश्यक है — लेकिन भरोसेमंद और रक्षात्मक Bash स्क्रिप्ट लिखने के लिए यह सबसे प्रभावी एकल आदत है।

शुरुआत निःशुल्क

एआई शिक्षक के साथ Bash सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
22
पाठ
88

अक्सर पूछे जाने वाले प्रश्न

क्या “set -euo pipefail के साथ सख्त मोड” पाठ निःशुल्क है?

हाँ—“set -euo pipefail के साथ सख्त मोड” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Linux कमांड लाइन और Bash स्क्रिप्टिंग में महारत पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Linux कमांड लाइन और Bash स्क्रिप्टिंग में महारत पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“set -euo pipefail के साथ सख्त मोड” में मैं क्या सीखूँगा?

विफलता पर तुरंत रुकने का व्यवहार सक्षम करें और समझें कि सख्त-मोड का प्रत्येक फ़्लैग किन त्रुटियों को पकड़ता है और किन्हें नहीं। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Linux कमांड लाइन और Bash स्क्रिप्टिंग में महारत का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Linux कमांड लाइन और Bash स्क्रिप्टिंग में महारत शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Linux कमांड लाइन और Bash स्क्रिप्टिंग में महारत शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 1वाँ पाठ है।

“set -euo pipefail के साथ सख्त मोड” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Linux कमांड लाइन और Bash स्क्रिप्टिंग में महारत पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Linux कमांड लाइन और Bash स्क्रिप्टिंग में महारत पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. set -euo pipefail के साथ सख्त मोड
  2. सफ़ाई और सिग्नल के लिए Trap हैंडलर
  3. सुरक्षित अस्थायी फ़ाइलें और लॉक डायरेक्टरी
  4. Idempotent स्क्रिप्ट और बैकऑफ़ सहित पुनःप्रयास तर्क
← Linux कमांड लाइन और Bash स्क्रिप्टिंग में महारत पर वापस जाएँ