Files
linux-bash/AGENTS.md
2026-04-04 13:24:58 +08:00

377 lines
8.8 KiB
Markdown

# AGENTS.md - Agent Coding Guidelines
This document provides guidelines for agents working in this repository.
---
## Project Overview
This is a **Bash shell script** repository containing multiple independent utilities for Linux server management. Each subdirectory is a separate project.
### Subprojects
| Directory | Description |
|-----------|-------------|
| `port-info/` | Linux port information display (TCP, UDP, HTTP services) |
| `docker-info/` | Docker and server information collector |
| `database-info/` | Database information collector (WIP) |
| `systemctl-info/` | Systemd/systemctl detailed information (v2.0 modular) |
| `filebrowser/` | FileBrowser installation/uninstall scripts |
| `frp/` | FRP (Fast Reverse Proxy) management scripts |
| `openlist/` | OpenList installation/management scripts |
| `mengyamonitor/` | MengyanMonitor installation scripts |
| `user-manager/` | User management utility |
| `change-mirror/` | Mirror changing and Docker installation scripts |
| `login-info/` | Login information display |
| `ssh/` | SSH key management scripts |
---
## Build / Lint / Test Commands
### Running Scripts
```bash
# Make executable and run
chmod +x <script>.sh
./<script>.sh
# Or run with bash
bash <script>.sh
```
### Linting
Use **shellcheck** for static analysis of all Bash scripts:
```bash
# Install shellcheck (if not present)
apt-get install shellcheck # Debian/Ubuntu
yum install epel-release && yum install ShellCheck # RHEL/CentOS
# Run shellcheck on a specific script
shellcheck port-info/port_info.sh
shellcheck docker-info/docker-info.sh
# Run with specific severity levels
shellcheck -S error <script>.sh # Errors only
shellcheck -S warning <script>.sh # Warnings and errors
# Check all scripts in repository
shellcheck port-info/*.sh docker-info/*.sh systemctl-info/systemctl-info \
filebrowser/*.sh frp/*.sh openlist/*.sh mengyamonitor/*.sh user-manager/*.sh \
change-mirror/*.sh login-info/*.sh ssh/*.sh
```
### Syntax Validation
```bash
# Check bash syntax without executing
bash -n <script>.sh
# Validate all scripts
for f in **/*.sh; do bash -n "$f" && echo "OK: $f"; done
```
### Testing a Single Function
Bash doesn't have traditional unit tests. Test functions interactively:
```bash
# Source the script and test specific functions
source <script>.sh
function_name argument # Test specific function
# Example: test port-to-service lookup
source port-info/port_info.sh
get_service_name 80 # Should output: HTTP
```
### Running Full Scripts
```bash
# Port info
bash port-info/port_info.sh
# Docker info (requires Docker installed)
bash docker-info/docker-info.sh
# Systemctl info (requires root for full functionality)
sudo bash systemctl-info/systemctl-info
```
---
## Code Style Guidelines
### General Bash Style
#### Shebang and Error Handling
- Always use `#!/usr/bin/env bash` or `#!/bin/bash`
- Add `set -euo pipefail` at the start of scripts for safety:
- `-e`: Exit on error
- `-u`: Exit on undefined variables
- `-o pipefail`: Pipeline fails if any command fails
#### Formatting
- **Indentation**: 4 spaces (no tabs)
- **Line length**: Keep lines under 100 characters
- **Quotes**: Always quote variables: `"$variable"` not `$variable`
- Use `printf` over `echo` for complex output
### Naming Conventions
```bash
# Functions - snake_case
print_header() { }
get_server_info() { }
check_root() { }
# Variables - descriptive names
local container_output
local cpu_count
local total_mem
# Constants - UPPER_CASE
readonly RED='\033[0;31m'
readonly HEADER_COLOR="${BRIGHT_CYAN}"
```
### Variable Naming Patterns
- **Constants** (colors, separators): UPPERCASE with underscores, e.g., `RED`, `SEPARATOR`
- **Global variables**: UPPERCASE, e.g., `PORT_CMD`
- **Local variables in functions**: lowercase with underscores, e.g., `local port=$1`
- **Function names**: lowercase with underscores, e.g., `check_commands()`
### Function Structure
```bash
# Good function definition
function_name() {
local arg1=$1
local arg2=$2
# function body
return 0 # Always return explicit status
}
# Document functions with comments
# 获取服务器信息
get_server_info() {
print_header "服务器信息"
local cpu_count=$(grep -c '^processor' /proc/cpuinfo)
print_key_value "CPU核心数" "$cpu_count"
}
```
### Color Variables
Define colors at the top of the script using ANSI escape codes:
```bash
# Basic colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color - always reset at end
# Bright colors
BRIGHT_CYAN='\033[1;36m'
BRIGHT_MAGENTA='\033[1;35m'
```
### Error Handling
```bash
# Check command existence before use
command_exists() {
command -v "$1" >/dev/null 2>&1
}
if ! command_exists docker; then
print_error "Docker未安装"
exit 1
fi
# Use proper exit codes
if [ "$?" -ne 0 ]; then
echo -e "${RED}Error: command failed${NC}" >&2
exit 1
fi
```
### Input Handling
- Prefer arguments over interactive input
- Validate inputs before processing
- Use `local` for all function parameters
- Check for required arguments
### String Comparisons
```bash
# String equality
if [ "$var" = "value" ]; then
# ...
fi
# Numeric comparison
if [ "$num" -eq 0 ]; then
# ...
fi
# Regex matching
if [[ "$port" =~ ^[0-9]+$ ]]; then
# ...
fi
```
### Common Patterns
#### Command Availability Check
```bash
if command -v ss &> /dev/null; then
PORT_CMD="ss"
elif command -v netstat &> /dev/null; then
PORT_CMD="netstat"
else
echo -e "${RED}Error: ss or netstat not found${NC}"
exit 1
fi
```
#### Reading Lines Safely
```bash
while IFS= read -r line; do
# process line
done < <(command)
```
#### Safe Variable Usage
- Always quote variables: `"$var"` not `$var`
- Use `${var}` for clarity in complex expressions
- Initialize variables before use
### Shellcheck Compliance
Run `shellcheck` and fix all warnings. Common issues:
- **SC2086**: Quote variables to prevent word splitting
- **SC2166**: Use `&&` instead of `-a` in test expressions
- **SC2027**: Quote strings containing newlines
- **SC2248**: Prefer printf over echo
- **SC1090**: Can't follow non-constant source (use explicit paths)
---
## Output Patterns
Use helper functions for consistent output:
```bash
print_header() # Boxed titles
print_section() # Section headers with arrows
print_key_value() # Key: Value pairs
print_success() # Green checkmark
print_warning() # Yellow warning
print_error() # Red X
```
---
## Testing Checklist
Before submitting changes:
- [ ] Run `shellcheck <script>.sh` with no warnings
- [ ] Run `bash -n <script>.sh` for syntax check
- [ ] Test on a system with required dependencies
- [ ] Test on a system without optional dependencies (graceful degradation)
- [ ] Verify all color output displays correctly
- [ ] Check that tables align properly
---
## Documentation
- Use Chinese comments to match existing codebase style (most scripts are Chinese-language)
- Add section separators: `#===============================================================================`
- Document function purpose before definition
- Include usage information in comments
- Document dependencies clearly
---
## File Extensions
- Bash scripts: `.sh`
- Executable scripts may have no extension
- Service files: `.service`
---
## Subproject Guidelines
For specific subproject guidelines, see the AGENTS.md files in each subdirectory:
- [port-info/AGENTS.md](port-info/AGENTS.md)
- [docker-info/AGENTS.md](docker-info/AGENTS.md)
- [systemctl-info/AGENTS.md](systemctl-info/AGENTS.md)
---
## Dependencies
### Required (Common)
- `bash` (4.0+)
- Standard POSIX utilities: `awk`, `grep`, `sed`, `sort`, `uniq`
### Optional
- `docker` - for docker-info script
- `systemctl`, `journalctl` - for systemctl-info script
- `shellcheck` - for linting
- `jq` - for better JSON parsing
---
## Security Notes
- Some scripts require root/sudo for full functionality
- Always validate user input if adding new features
- Use proper quoting to prevent word splitting and globbing
- Sanitize any data passed to `eval` or similar dangerous operations
- Never hardcode credentials or sensitive data
---
## Common Tasks
### Adding a New Port Service (port-info)
Edit `get_service_name()` function:
```bash
get_service_name() {
local port=$1
case $port in
80) echo "HTTP" ;;
443) echo "HTTPS" ;;
3306) echo "MySQL" ;;
9000) echo "PHP-FPM" ;;
*) echo "未知" ;;
esac
}
```
### Adding a New Module (systemctl-info)
1. Create a new function following existing patterns: `module_xxx()`
2. Add function to the module list array
3. Use consistent color scheme and formatting
4. Add documentation in the AGENTS.md
### Adding a New Utility
1. Create new directory if it's a significant project
2. Follow the code style guidelines above
3. Create an AGENTS.md for the subproject
4. Add to the project table in this file