Claude-skill-registry bun-shell-commands
Writing shell commands for OpenCode custom commands using Bun Shell
git clone https://github.com/majiayu000/claude-skill-registry
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/bun-shell-commands" ~/.claude/skills/majiayu000-claude-skill-registry-bun-shell-commands && rm -rf "$T"
skills/data/bun-shell-commands/SKILL.mdBun Shell Commands
This skill covers how to write effective shell commands in OpenCode custom commands using Bun Shell (Bun's bash-like shell implementation).
Context
OpenCode uses Bun Shell for executing shell commands in custom commands via the !
command syntax. Bun Shell is a bash-like shell written in Zig that provides cross-platform shell scripting, but it has some differences from traditional bash.
Supported Features
✅ Arguments
Positional arguments work correctly:
!`echo "Arg1: $1" && echo "Arg2: $2" && echo "Arg3: $3"`
Usage:
/mycommand 5 "hello world" "a,b,c"
✅ Command Substitution
Use
$(command) for command substitution:
!`echo "Sum: $(seq $1 | awk '{s+=$1} END {print s}')"`
✅ Pipes
Pipe commands using
|:
!`echo "$2" | tr '[:lower:]' '[:upper:]' | rev`
✅ Environment Variables
Set environment variables and use them:
!`TEST_VAR="$1" && echo "TEST_VAR=$TEST_VAR"`
Store command substitution results in variables:
!`REV=$(echo "$2" | rev) && echo "Reversed: $REV"`
✅ Command Chaining
Use
&& to chain commands (instead of newlines or ;):
!`echo "First" && echo "Second" && echo "Third"`
✅ Available Commands
Bun Shell includes these built-in commands:
,cd
,ls
,rm
,echo
,pwd
,cat
,touch
,mkdir
,whichmv
,seq
,dirname
,basename
,true
,falseyes
Common external commands also work:
,awk
,sed
,tr
,wc
,grep
,headtail
,find
,xargs
,sortuniq
Unsupported Features
❌ Shell Control Structures
Do NOT use
for, while, do, done:
# ❌ DOESN'T WORK !`for i in $(seq 1 $1); do echo $i; done`
❌ Arithmetic Expansion
Do NOT use
$(( )) directly in the template:
# ❌ DOESN'T WORK !`echo "Squared: $(($1 * $1))"`
Use
$(awk '{...}') instead:
# ✅ WORKS !`echo "$1" | awk '{print $1 * $1}'`
❌ Native Brace Expansion
Native brace expansion is not supported:
# ❌ DOESN'T WORK !`echo {1,2,3}`
Use pipes to simulate expansion:
# ✅ WORKS !`echo "$3" | tr ',' '\n' | awk '{print "Expanded:", $1}'`
Patterns and Best Practices
Loops via Pipes
Instead of
for loops, use seq with awk:
# Generate numbers 1 to N with squares !`seq $1 | awk '{print $1, "-> squared:", $1*$1}'`
Multi-step Operations
Use environment variables to store intermediate results:
# Reverse text, count chars, and show both !`REV=$(echo "$2" | rev) && COUNT=$(echo "$2" | wc -c) && echo "Reversed: $REV (${COUNT} chars)"`
Conditional Logic
Use
awk for conditionals:
# Classify numbers as even/odd !`seq $1 | awk '{if ($1 % 2 == 0) print $1 ": even"; else print $1 ": odd"}'`
Text Processing
Combine
tr, sed, awk for text manipulation:
# Uppercase, reverse, and format !`echo "$2" | tr '[:lower:]' '[:upper:]' | rev | sed 's/^/> /'`
Working with Multiple Arguments
Use separate shell blocks for independent tests:
## Test 1: Arithmetic with $1 !`seq $1 | awk '{s+=$1} END {print "Sum:", s}'` ## Test 2: Text processing with $2 !`echo "$2" | tr '[:lower:]' '[:upper:]' | rev` ## Test 3: Pattern with $3 !`echo "$3" | tr ',' '\n' | wc -l`
Example: Complete Command
--- description: Test Bun Shell capabilities --- Test Bun Shell with multiple features: ## Argument passing !`echo "Arg1: [$1]" && echo "Arg2: [$2]" && echo "Arg3: [$3]"` ## Command substitution !`echo "Sum of 1 to $1: $(seq $1 | awk '{s+=$1} END {print s}')"` ## Text processing !`echo "$2" | tr '[:lower:]' '[:upper:]' | rev | wc -c` ## Environment variables !`REV=$(echo "$2" | rev) && echo "Reversed via var: $REV"`
Usage:
/mycommand 5 "hello world" "a,b,c"
Debugging
If a shell command fails silently:
- Simplify to just
to verify argument passingecho "$1" - Test each pipe segment separately
- Replace complex
with simplerawk
ortrsed - Use
at each step to verify intermediate valuesecho