Articles
DevOps
Shell scripts, CI/CD pipelines and the exit-code traps, pipe gotchas and quiet false positives that live in the plumbing between them.
Most of these notes share one thread: a command or a tool that reports success when the work did not happen.
Exit codes that lie. Bash $? after a failed if is 0. curl exits 0 on a 404 until you add --fail. grep's exit status is 0, 1 or 2, and a CI gate that grepped for the word FAILED passed a red build. A piped mysqldump | gzip made a 20-byte backup marked completed, and ln -s in Git Bash copies instead of linking and still exits 0.
Checks that mislead. A 403 is not a broken link when the site is refusing a script. Backticks inside a double-quoted shell string run as commands, which matters in commit messages.
Certificates. Does an HTTPS redirect break Let's Encrypt renewal? Usually not; a rule that changes the path, host or port does.
Search these 9 posts
Everything in DevOps

11/09/2026
Does an HTTPS Redirect Break Let's Encrypt Renewal?
Let's Encrypt follows a plain HTTP-to-HTTPS redirect. What fails renewal is a rule that changes the path, host or port. How to find and fix yours.

11/02/2026
Bash
$?After a FailedifIs 0, Not Your Exit CodeReading $? after fi gives the if statement's status, so a failed command reads as 0. How to keep the real code under set -e, and PowerShell's version.

10/22/2026
curl Exits 0 on a 404: Use --fail in Scripts
By default curl reports success even when the server answers 404 or 500. How to see it, and how --fail and --fail-with-body change the exit code.

10/21/2026
Backticks in a Double-Quoted Shell String Run as Commands
A backtick inside double quotes in a shell command runs as a command and drops its text. How to see it, fix it and avoid it in commit messages.

09/27/2026
grep exit status: 0, 1 and 2 explained
grep exits 0 when it selected a line, 1 when it selected none, and 2 on an error. Here is what -q, -c, set -e and pipelines do to that.

09/15/2026
A 403 Isn't a Broken Link: Bot Blocking in Link Checkers
Link checkers report pages as broken when the site is really just refusing a script. How to tell a dead link from a blocked one, with a small Python check.

09/15/2026
ln -sin Git Bash Copies Instead of Linking (and Exits 0)On Windows, Git Bash's ln -s quietly makes a copy, not a symlink, and reports success. Here's why, how to get a real symlink, and how to check you got one.

09/15/2026
mysqldump | gzipMade a 20-Byte Backup That Said It WorkedA piped backup reports only the last command's exit code, so a failed mysqldump still produced a 20-byte .gz marked completed. The fix is pipefail, plus a check.

09/10/2026
grepExits Zero When It Finds the Word FAILEDA CI gate piped test output through grep for readability, and a red build passed anyway -- because grep succeeds when it finds a match, even the word FAILED.