원클릭으로
bash
Language-specific super-code guidelines for bash.
메뉴
Language-specific super-code guidelines for bash.
Optimize pull requests for quick approval and merging by ensuring clean diffs, comprehensive self-reviews, and structured documentation.
Frontend design entry point: direction, design system, visual philosophy. Use whenever building or touching the look of any web UI (components, pages, dashboards, React/Vue/HTML-CSS) or when the user says "make this look better", "fix the spacing/layout", or mentions styling, color, type, or polish.
Render the UI and prove it's balanced + usable: a deterministic layout audit (centroid / optical-center / pixel-oracle balance via explicit math + annotated screenshot) plus a vision-judged Nielsen usability audit by a separate fresh-eyes judge. The measurement layer taste-only design skills lack.
Automated visual tuning: a vision or video model rates rendered variants in a loop. Render several labeled variants into one artifact, ask the model to rate them and suggest better values, render the suggestions, ask it to pick the best, repeat until good — the model is the eye, you run the loop.
Human-in-the-loop web studio to tune AI-generated output by eye. Stand up a local interactive studio (sliders, pickers, drag handles) or an inline edit/highlight/comment annotation studio for prose & media, instead of guessing values or shipping a static comparison grid.
macOS screen recorder that captures the main display PLUS system audio via ScreenCaptureKit — no BlackHole/loopback driver, no sudo, just the standard Screen Recording permission. CLI-driven; fills the headless-screen-recording-with-system-sound gap QuickTime and `screencapture -v` can't.
| name | bash |
| description | Language-specific super-code guidelines for bash. |
| risk | safe |
| source | community |
| date_added | 2026-06-16 |
# ❌ Unquoted variable (word splitting + globbing)
for f in $files; do rm $f; done
# ✅
for f in "${files[@]}"; do rm -- "$f"; done
# ❌ Unquoted command substitution
path=$(find . -name config)
cat $path # breaks on spaces
# ✅
path="$(find . -name config)"
cat "$path"
# ❌ Using backticks for command substitution
result=`echo hello`
# ✅ — $() nests cleanly
result=$(echo hello)
# ❌ String comparison without quotes
if [ $var = "hello" ]; then # breaks if var is empty or has spaces
# ✅
if [[ "$var" = "hello" ]]; then
Rule: double-quote every $variable and $(command) unless you specifically need splitting.
# ❌ Single bracket test (POSIX but fragile)
if [ -f "$file" -a -r "$file" ]; then
# ✅ — [[ is safer, supports &&/||, no word splitting inside
if [[ -f "$file" && -r "$file" ]]; then
# ❌ Testing command exit status with if [ $? -eq 0 ]
grep -q pattern file
if [ $? -eq 0 ]; then echo "found"; fi
# ✅ — test command directly
if grep -q pattern file; then echo "found"; fi
# ❌ String equality with == outside [[
if [ "$a" == "$b" ]; then # == not POSIX in [ ]
# ✅
if [[ "$a" == "$b" ]]; then # Bash
# or POSIX:
if [ "$a" = "$b" ]; then
# ❌ Arithmetic with [ ] and string comparison
if [ "$count" -gt 10 ]; then
# ✅ — (( )) for arithmetic
if (( count > 10 )); then
# ❌ Parsing ls output
for f in $(ls *.txt); do process "$f"; done
# ✅ — glob directly
for f in *.txt; do
[[ -e "$f" ]] || continue # handle no-match
process "$f"
done
# ❌ Reading file line-by-line with for
for line in $(cat file.txt); do # splits on words, not lines
# ✅
while IFS= read -r line; do
process "$line"
done < file.txt
# ❌ Seq for counting
for i in $(seq 1 10); do
# ✅ — brace expansion (Bash)
for i in {1..10}; do
# or C-style:
for (( i = 1; i <= 10; i++ )); do
# ❌ Processing command output line-by-line with pipe (subshell trap)
count=0
cat file.txt | while read -r line; do
(( count++ )) # count resets after loop — subshell
done
echo "$count" # always 0
# ✅ — redirect, not pipe
count=0
while IFS= read -r line; do
(( count++ ))
done < file.txt
echo "$count"
# ❌ Chained grep | grep for AND
grep "error" log.txt | grep "timeout"
# ✅ — single grep with pattern
grep -E "error.*timeout|timeout.*error" log.txt
# or awk for complex logic:
awk '/error/ && /timeout/' log.txt
# ❌ cat + pipe (UUOC — Useless Use of Cat)
cat file.txt | grep pattern
# ✅
grep pattern file.txt
# ❌ Temp file for diff between commands
cmd1 > /tmp/a.txt
cmd2 > /tmp/b.txt
diff /tmp/a.txt /tmp/b.txt
rm /tmp/a.txt /tmp/b.txt
# ✅ — process substitution
diff <(cmd1) <(cmd2)
# ❌ Ignoring pipe failures (only last command's exit code)
false | true
echo $? # 0 — false's failure hidden
# ✅
set -o pipefail
false | true
echo $? # 1
# ❌ Using return for string values
get_name() {
return "Alice" # return is for exit codes (0-255)
}
# ✅ — echo + capture
get_name() {
echo "Alice"
}
name=$(get_name)
# ❌ Global variables modified inside functions
result=""
compute() { result="done"; }
# ✅ — use local, return via stdout
compute() {
local tmp
tmp=$(do_work)
echo "$tmp"
}
result=$(compute)
# ❌ Function keyword (not POSIX)
function my_func {
# ✅
my_func() {
# ❌ No error handling — script continues after failure
cd /some/dir
rm -rf * # if cd fails, deletes from wrong directory
# ✅
set -euo pipefail
cd /some/dir || { echo "cd failed" >&2; exit 1; }
rm -rf ./*
# ❌ No cleanup on exit
tmpfile=$(mktemp)
# ... script might exit early, leaving tmpfile
# ✅ — trap for cleanup
tmpfile=$(mktemp)
trap 'rm -f "$tmpfile"' EXIT
# ❌ Silencing errors blindly
command 2>/dev/null
# ✅ — redirect only when you know what you're suppressing
command 2>/dev/null || true # explicit: we expect and accept failure
Start every script with set -euo pipefail. Remove selectively where needed.
| Anti-pattern | Preferred |
|---|---|
Parsing ls output | glob: for f in *.txt |
cat file | grep | grep pattern file |
Unquoted $var | "$var" always |
[ ] for complex tests | [[ ]] |
| Backtick substitution | $(command) |
$? check after command | if command; then |
echo for debug | printf '%s\n' (portable) |
No set -euo pipefail | always set at script top |
| Temp files without cleanup | trap 'rm -f "$tmp"' EXIT |
eval with user input | avoid; use arrays for dynamic commands |
#!/bin/sh with Bash features | #!/usr/bin/env bash |
String math expr 1 + 1 | $(( 1 + 1 )) |
test -z for number comparison | (( )) for arithmetic |