📖 Scenario: You are writing a bash script to process a list of files. Sometimes commands in a pipeline fail, but the script still shows success. You want to catch failures in any part of the pipeline.
🎯 Goal: Learn how to use set -o pipefail in a bash script to detect errors in any command within a pipeline.
📋 What You'll Learn
Create a bash script variable with a pipeline command
Add set -o pipefail to enable error detection in pipelines
Run the pipeline and capture the exit status
Print the exit status to see if the pipeline succeeded or failed
💡 Why This Matters
🌍 Real World
In real scripts, pipelines are common. Without <code>set -o pipefail</code>, errors in early commands can be missed, causing wrong results or silent failures.
💼 Career
Understanding <code>set -o pipefail</code> is essential for writing reliable bash scripts in DevOps, system administration, and automation roles.
Progress0 / 4 steps
1
Create a pipeline command variable
Create a variable called pipeline_cmd that stores the command cat file.txt | grep 'hello'.
Bash Scripting
Hint
Use double quotes around the whole command string and single quotes around 'hello'.
2
Enable pipefail option
Add the line set -o pipefail at the start of the script to enable error detection in pipelines.
Bash Scripting
Hint
This command makes the script detect failure in any part of a pipeline.
3
Run the pipeline command and capture exit status
Run the command stored in pipeline_cmd using eval and save the exit status in a variable called status.
Bash Scripting
Hint
Use eval "$pipeline_cmd" to run the command string, then status=$? to get the exit code.
4
Print the exit status
Print the value of status using echo to show if the pipeline succeeded (0) or failed (non-zero).
Bash Scripting
Hint
Use echo $status to display the exit code.
Practice
(1/5)
1. What does the set -o pipefail command do in a bash script?
easy
A. It makes the pipeline return the exit status of the last failed command.
B. It disables all error checking in the script.
C. It forces the script to ignore errors in pipelines.
D. It restarts the pipeline if any command fails.
Solution
Step 1: Understand pipeline exit status behavior
Normally, a pipeline returns the exit status of the last command only, ignoring failures in earlier commands.
Step 2: Effect of set -o pipefail
This option changes the pipeline's exit status to that of the last failed command, making error detection more reliable.
Final Answer:
It makes the pipeline return the exit status of the last failed command. -> Option A
Quick Check:
Pipeline failure detection = It makes the pipeline return the exit status of the last failed command. [OK]
Hint: Remember: pipefail catches failures anywhere in a pipeline [OK]
Common Mistakes:
Thinking it disables error checking
Assuming it restarts pipelines on failure
Believing it ignores errors in commands
2. Which of the following is the correct way to enable pipefail in a bash script?
easy
A. set pipefail on
B. set -o pipefail
C. enable pipefail
D. pipefail enable
Solution
Step 1: Recall bash syntax for options
Bash uses set -o option_name to enable shell options.
Step 2: Identify correct syntax for pipefail
The correct command to enable pipefail is set -o pipefail.
Final Answer:
set -o pipefail -> Option B
Quick Check:
Enable pipefail = set -o pipefail [OK]
Hint: Use 'set -o' before option name to enable it [OK]
Common Mistakes:
Using 'set pipefail on' which is invalid syntax
Trying 'enable pipefail' which is not a bash command
Writing 'pipefail enable' which is incorrect order
3. Consider this script snippet with set -o pipefail enabled:
set -o pipefail
false | true | true
echo $?
What will be the output?
medium
A. 1
B. 0
C. 2
D. 3
Solution
Step 1: Understand commands in pipeline
The first command false returns exit status 1 (failure), the others return 0 (success).
Step 2: Effect of set -o pipefail
With pipefail, the pipeline exit status is the exit status of the last failed command, which is 1.
Final Answer:
1 -> Option A
Quick Check:
Pipeline exit status = last failure = 1 [OK]
Hint: With pipefail, pipeline returns last error code [OK]
Common Mistakes:
Assuming output is 0 because last command succeeds
Thinking output is sum of exit codes
Confusing exit codes with command count
4. You have this script:
set -o pipefail
cat file.txt | grep 'pattern' | sort
if [ $? -ne 0 ]; then
echo 'Error detected'
fi
But it never prints 'Error detected' even if grep fails. What is the likely problem?
medium
A. The script needs set -e instead.
B. The if condition syntax is incorrect.
C. The pipeline commands are all succeeding.
D. set -o pipefail was not enabled before the pipeline.
Solution
Step 1: Check when pipefail is enabled
If set -o pipefail is enabled after the pipeline runs, it won't affect that pipeline's exit status.
Step 2: Confirm error detection depends on pipefail
Without pipefail enabled before the pipeline, the exit status is from the last command, so failures in earlier commands are missed.
Final Answer:
set -o pipefail was not enabled before the pipeline. -> Option D
Quick Check:
Enable pipefail before pipeline = set -o pipefail was not enabled before the pipeline. [OK]
Hint: Enable pipefail before running pipelines to catch errors [OK]
Common Mistakes:
Assuming set -e alone catches pipeline errors
Thinking if syntax is wrong
Believing all commands always succeed
5. You want to write a script that stops immediately if any command in a pipeline fails. Which combination of bash options should you use?
hard
A. set -o pipefail only
B. set -e only
C. set -e and set -o pipefail
D. set -u and set -o pipefail
Solution
Step 1: Understand set -e behavior
set -e makes the script exit immediately if any command returns a non-zero status.
Step 2: Understand set -o pipefail role
Without pipefail, set -e ignores failures in earlier pipeline commands because the pipeline exit status is from the last command.
Step 3: Combine both for strict error detection
Using both set -e and set -o pipefail ensures the script exits on any failure inside pipelines.
Final Answer:
set -e and set -o pipefail -> Option C
Quick Check:
Exit on any failure = set -e + pipefail = set -e and set -o pipefail [OK]
Hint: Use both set -e and pipefail to stop on any pipeline error [OK]
Common Mistakes:
Using only pipefail without set -e
Using only set -e without pipefail
Confusing set -u (undefined vars) with error exit
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.