← Back to Bash Course | Chapter 12: Error Handling & Debugging | Lesson 6 of 12

set -u (Undefined Variables) और set -x (Trace Mode)

set -u एक script को complain करवाता है अगर आप एक ऐसी variable उपयोग करने की कोशिश करें जिसे कभी कोई value नहीं दी गई, और set -x हर command को run होते ही print करता है ताकि आप script के execution को step by step देख सकें।
Syntax
bash
set -u
echo "${variable:-default}"
set -x    # trace commands
set +x

Catching Unset Variables

set -u active होने पर, एक ऐसी variable को reference करना जिसे कभी assign नहीं किया गया एक immediate error और non-zero exit cause करता है, जो variable names में typos को silently कुछ भी नहीं में expand होने के बजाय early catch करने में मदद करता है।

उदाहरण: Catching Unset Variables

bash
#!/bin/bash
(
    set -u
    echo "$defined_var" 2>/dev/null
) ; defined_var="hello"
(
    set -u
    echo "now it's set: $defined_var"
)

Safely Demonstrating set -u's Error

Failing case को एक subshell के अंदर run करना और इसके overall result को || से check करना एक script को यह दिखाने देता है कि set -u क्या catch करता है बिना उस failure को पूरा script खत्म करने दिए।

उदाहरण: Safely Demonstrating set -u's Error

bash
#!/bin/bash
(set -u; echo "$totally_undefined_variable") 2>/dev/null || echo "caught: set -u stopped an unset variable reference"

Providing Defaults to Avoid set -u Errors

${var:-default} हमेशा default में expand होता है जब var unset (या empty) हो, जो एक script को set -u के साथ compatible बनाने का standard तरीका है फिर भी optional variables allow करते हुए, जैसे positional parameters जो दिए न गए हों।

उदाहरण: Providing Defaults to Avoid set -u Errors

bash
#!/bin/bash
set -u
name="${1:-anonymous}"
echo "Hello, $name"

Tracing Execution with set -x

set -x bash को हर command को stderr पर print करवाता है, + से prefixed, इसे run करने से ठीक पहले, variables already उनकी actual values में expanded के साथ। यह exactly देखने के सबसे तेज़ तरीकों में से एक है कि एक script क्या कर रहा है।

Note: अगर आप trace output को normal terminal output से बाहर रखना चाहते हैं तो exec 2>trace.log से trace output को separately redirect करें।
Warning: set -x passwords या tokens जैसी sensitive values print कर सकता है; secrets handle करने वाले code के आस-पास इससे बचें।

उदाहरण: Tracing Execution with set -x

bash
#!/bin/bash
set -x
num=5
double=$((num * 2))
set +x
echo "tracing disabled again; double is $double"
Related Topics
{# common_mistakes/chapter_summary/browser_support: on Hindi pages the view already swaps in the hi_ translation fields (or blanks these out if untranslated), so this renders correctly for both languages without a lang_code check here. #}
आम गलतियां
  1. यह भूल जाना कि set -u एक unset variable को एक error के रूप में treat करता है even $1 जैसी common चीज़ में जब कोई argument pass नहीं किया गया था, जिसे ${1:-} जैसा एक default चाहिए।
  2. Production output में set -x enabled छोड़ देना, जो sensitive values (जैसे variables में stored passwords) को logs में leak कर सकता है।
  3. यह मान लेना कि set -u एक variable को catch करता है जो एक empty string में set है; empty और unset अलग हैं, और set -u सिर्फ बाद वाले की शिकायत करता है।
चैप्टर सारांश
  • set -u एक error cause करता है जब एक unset variable reference की जाती है, इसे silently एक empty string treat करने के बजाय।
  • ${var:-default} एक fallback value प्रदान करता है और एक ऐसी variable के लिए एक set -u error से बचता है जो set न हो सकती हो।
  • set -x हर command (variables expanded के साथ) को इसके execute होने से ठीक पहले stderr पर print करता है, जो debugging के लिए invaluable है।
  • set +u और set +x हर mode को फिर से off कर देते हैं; दोनों को set -e के साथ भी एक strict-mode header के हिस्से के रूप में combine किया जा सकता है।

Login to run this code

C/C++/Java/PHP execution requires a free account. Your code is saved — you'll land right back in the editor after logging in.