当前位置:首页>Linux>Linux 新手最常踩的 10 个命令坑,你中过几个?

Linux 新手最常踩的 10 个命令坑,你中过几个?

  • 2026-04-16 15:46:33
Linux 新手最常踩的 10 个命令坑,你中过几个?

背景与问题引入

从事运维工作十余年,带过不少新人,发现有些命令错误几乎是每个Linux使用者都曾经遇到过的。这些错误轻则导致操作失败、浪费时间,重则引发数据丢失、服务中断、生产事故。本篇文章结合2026年最新的Linux内核特性(kernel 6.x系列)和常见发行版环境(Ubuntu 24.04 LTS、RHEL 9.4、CentOS Stream 10),系统梳理新手最常踩的10个命令坑,帮助读者建立正确的操作习惯和风险意识。

文章面向初中级运维工程师,假设读者具备基本的Linux操作经验,能够登录终端、执行简单命令、编辑文件。阅读本文时,建议在测试环境中动手实践每个案例,建立肌肉记忆。

坑1:rm -rf 的恐怖威力

原理分析

rm是Linux中最危险的标准命令之一。其核心机制是将文件的inode引用计数减1,当引用计数归零时,文件系统的block位图会标记对应数据块为"可用",此时文件数据从用户视角已经不可访问。关键问题在于:rm执行后,数据块的回收是即时的,文件系统不会保留任何"回收站"机制,不像Windows的回收站或者macOS的废纸篓。

2026年的Linux发行版中,部分桌面环境(如Ubuntu 24.04的GNOME)默认对rm命令进行了别名设置,在交互式shell中会提示确认,但这仅限于桌面环境的终端模拟器。在远程SSH会话、脚本执行、管道操作等场景下,别名不会生效。

常见错误场景

场景一:变量扩展导致的误删

# 错误写法DIR=/tmp/logsrm -rf $DIR# 如果DIR变量为空,rm -rf / 将删除根目录# 正确写法DIR=/tmp/logsrm -rf "${DIR}"# 加引号保护# 更安全的写法:先检查变量是否为空DIR=/tmp/logsif [ -n "$DIR" ]; then    rm -rf "$DIR"elseecho"DIR变量为空,拒绝执行删除"exit 1fi

场景二:末尾斜杠导致路径解析错误

# 假设 /data/logs 是一个符号链接指向 /mnt/storage/logsrm -rf /data/logs/    # 删除了符号链接指向的 /mnt/storage/logs 内容rm -rf /data/logs      # 删除了符号链接本身,源目录保留# 使用 -r 时对末尾斜杠的行为ls -la /data/logs/# total 8# drwxr-xr-x  2 root root 4096 Apr  7 10:00 .# drwxr-xr-x 12 root root 4096 Apr  7 09:00 ..# -rw-r--r--  1 root root  1024 Apr  7 10:00 app.logrm -rf /data/logs/     # 行为等同于 rm -rf /data/logs/*,删除目录下所有文件rm -rf /data/logs      # 删除 logs 目录本身,如果logs是目录而非符号链接

场景三:find + exec 的不可逆删除

# 危险写法:空格导致灾难find /var/log -name "*.tmp" -exec rm -rf {} \;# 如果find结果中有空格或特殊字符,{} 会被拆分成多个参数# 正确写法find /var/log -name "*.tmp" -exec rm -rf "{}" \;# 或者find /var/log -name "*.tmp" -exec rm -rf {} +# + 结尾让 find 批量传递参数,减少 rm 调用次数# 最安全的写法:先 -print 确认目标,再执行find /var/log -name "*.tmp" -print# 确认输出无误后,再替换为 -deletefind /var/log -name "*.tmp" -delete

最佳实践与防御策略

策略一:启用回收站别名

# 在 ~/.bashrc 或 ~/.zshrc 中添加alias rm='mv --target-directory=$HOME/.trash'alias rrm='rm -rf'# 创建回收站目录mkdir -p ~/.trash# 设置定时清理(crontab)crontab -l | grep trash || echo"0 2 * * * find ~/.trash -mtime +7 -delete" >> ~/.var/spool/cron/crontabs/root

策略二:使用 safe-rm 工具

# Ubuntu/Debian 安装apt-get update && apt-get install -y safe-rm# RHEL/CentOS 从源码编译安装cd /tmpwget https://launchpad.net/safe-rm/trunk/1.2.0/+download/safe-rm-1.2.0.tar.gztar -xzf safe-rm-1.2.0.tar.gzcd safe-rm-1.2.0cp safe-rm /usr/local/bin/safe-rmchmod +x /usr/local/bin/safe-rm# 配置保护路径cat > /etc/safe-rm.conf << 'EOF'/bin/boot/dev/etc/lib/lib64/proc/root/run/sbin/srv/sys/tmp/usr/varEOF

策略三:容器环境下的数据卷保护

# Kubernetes Pod 安全上下文示例apiVersion: v1kind: Podmetadata:  name: safe-appspec:  securityContext:    readOnlyRootFilesystem: true  volumes:  - name: data    persistentVolumeClaim:      claimName: app-data-pvc  - name: tmp    emptyDir: {}  containers:  - name: app    image: app:2026    securityContext:      allowPrivilegeEscalation: false      readOnlyRootFilesystem: true    volumeMounts:    - name: data      mountPath: /app/data      readOnly: true    - name: tmp      mountPath: /tmp

坑2:grep 默认递归的坑

原理分析

grep的-r选项在2026年的主流发行版中行为没有变化,但新手经常忽略其默认不跟随符号链接的特性。grep会在指定目录的所有文件中递归搜索匹配的行,输出格式为filename:line content

常见错误场景

场景一:符号链接目录被忽略

# 创建测试环境mkdir -p /tmp/test/codeecho"database_password=secret123" > /tmp/test/code/config.pyln -s /tmp/test/code /tmp/test/link_to_code# 使用 -r 搜索,符号链接目录被忽略grep -r "database_password" /tmp/test/# 输出:# /tmp/test/code/config.py:database_password=secret123# 使用 -L 跟随符号链接grep -rL "database_password" /tmp/test/# 输出:# /tmp/test/link_to_code/config.py:database_password=secret123# 明确使用 -r --follow 跟随符号链接grep -r --follow "database_password" /tmp/test/

场景二:二进制文件干扰输出

# /var/log 中经常包含压缩的日志文件(.gz)grep "error" /var/log/*# 输出中包含大量匹配二进制文件的警告# 正确写法:排除二进制文件grep --binary-files=without-match "error" /var/log/*# 或者grep -I "error" /var/log/*# 更精确的写法:只搜索文本日志grep -r --include="*.log""error" /var/log/

场景三:大文件性能问题

# 搜索整个 /var/log 可能非常慢grep -r "error" /var/log/# 使用并行加速(GNU grep 默认已并行,但可明确指定)grep -r --mmap "error" /var/log/    # 使用 mmap 提升性能# 使用 ripgrep(推荐安装)rg "error" /var/log/ -t log# -t 指定文件类型rg "error" /var/log/ --no-ignore     # 忽略 .gitignore 等rg "error" /var/log/ -j 4           # 指定并行线程数

高级搜索脚本

日志关键字批量搜索脚本

#!/bin/bash# search_logs.sh - 日志批量搜索工具# 用法:./search_logs.sh [-t type] [-d dir] [-o output] "keyword"set -euo pipefailSCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"LOG_DIR="${LOG_DIR:-/var/log}"OUTPUT_FILE=""SEARCH_TYPE="log"KEYWORD=""usage() {    cat << EOF用法: $0 [-t type] [-d dir] [-o output] "keyword"选项:    -t type     文件类型,如 log, txt, json (默认: log)    -d dir      搜索目录 (默认: /var/log)    -o output   输出文件,不指定则输出到 stdout    -h          显示帮助示例:$0 "error" -d /var/log -o /tmp/errors.txt$0 "Exception" -t logEOF    exit 1}while getopts "t:d:o:h" opt; do    case $opt in        t) SEARCH_TYPE="$OPTARG" ;;        d) LOG_DIR="$OPTARG" ;;        o) OUTPUT_FILE="$OPTARG" ;;        h) usage ;;        *) usage ;;    esacdoneshift $((OPTIND - 1))KEYWORD="$1"if [ -z "$KEYWORD" ]; then    echo "错误:必须指定搜索关键字" >&2    usagefi# 检查目录是否存在if [ ! -d "$LOG_DIR" ]; then    echo "错误:目录不存在: $LOG_DIR" >&2    exit 1fi# 执行搜索if [ -n "$OUTPUT_FILE" ]; then    grep -r --binary-files=without-match \           --include="*.${SEARCH_TYPE}" \           --include="*.${SEARCH_TYPE}.*" \           "$KEYWORD" "$LOG_DIR/" > "$OUTPUT_FILE" 2>/dev/null || true    echo "结果已保存到: $OUTPUT_FILE"    echo "共找到 $(wc -l < "$OUTPUT_FILE") 处匹配"else    grep -r --binary-files=without-match \           --include="*.${SEARCH_TYPE}" \           --include="*.${SEARCH_TYPE}.*" \           "$KEYWORD" "$LOG_DIR/" 2>/dev/null || truefi

坑3:cp 覆盖不提示的陷阱

原理分析

cp命令在默认情况下会无条件覆盖目标文件,不会询问确认。这是因为cp设计之初假设用户知道自己正在做什么。在管道和脚本环境中,这一行为可能导致数据意外丢失。

常见错误场景

场景一:别名导致预期外的行为

# 检查 cp 别名alias cp# 输出: alias cp='cp -i'   (-i 表示 interactive,会提示确认)# 但在脚本中,别名不会展开#!/bin/bashcp /source/file1 /dest/file1   # 如果有别名 cp='cp -i',会提示确认# 在脚本中,cp 会使用原始行为,不加 -i# 解决方案:明确使用 /bin/cp#!/bin/bash/bin/cp /source/file1 /dest/file1

场景二:-n 和 -i 的冲突

# 创建测试文件echo"new content" > /tmp/test.txtecho"old content" > /tmp/dest.txt# -n (no-clobber) 阻止覆盖,但与 -i 冲突cp -n /tmp/test.txt /tmp/dest.txt   # 目标文件保持不变echo $?   # 输出 0,表示成功(但实际没有复制)# 如果需要强制覆盖,使用 -f (force)cp -f /tmp/test.txt /tmp/dest.txt   # 强制覆盖

场景三:目录复制的深度问题

# 创建测试目录结构mkdir -p /tmp/src/subdir1/subdir2echo"file1" > /tmp/src/file1.txtecho"file2" > /tmp/src/subdir1/file2.txtecho"file3" > /tmp/src/subdir1/subdir2/file3.txt# 复制目录(需要 -r 或 -a)cp /tmp/src /tmp/dest      # 错误:复制的是目录本身,不是内容cp -r /tmp/src/* /tmp/dest/  # 复制目录内容,但不复制隐藏文件# 正确复制整个目录(包括隐藏文件)cp -r /tmp/src/ /tmp/dest/# 或者rsync -a /tmp/src/ /tmp/dest/# 检查复制结果find /tmp/dest -type f# /tmp/dest/src/file1.txt# /tmp/dest/src/subdir1/file2.txt# /tmp/dest/src/subdir1/subdir2/file3.txt

安全复制脚本

#!/bin/bash# safe_cp.sh - 带确认的安全复制脚本set -euo pipefailSRC="$1"DEST="$2"BACKUP_DIR="/tmp/safe_cp_backup/$(date +%Y%m%d_%H%M%S)"# 如果目标存在,创建备份if [ -e "$DEST" ]; then    mkdir -p "$BACKUP_DIR"echo"目标文件存在,正在创建备份到: $BACKUP_DIR"    cp -r "$DEST""$BACKUP_DIR/"fi# 执行复制cp -r "$SRC""$DEST"echo"复制完成!"echo"源: $SRC"echo"目标: $DEST"[ -d "$BACKUP_DIR" ] && echo"备份: $BACKUP_DIR"

坑4:cat 与 EOF 的陷阱

原理分析

heredoc(here document)是shell中用于输入多行文本的机制,但其中涉及多个转义和引用规则,新手经常在变量展开、引号处理、EOF定界符上出错。

常见错误场景

场景一:变量被展开

# 变量被展开NAME="John"cat << EOFHello, $NAMEWelcome to LinuxEOF# 输出:# Hello, John# Welcome to Linux# 正确写法:加引号阻止变量展开cat << 'EOF'Hello, $NAMEWelcome to LinuxEOF# 输出:# Hello, $NAME# Welcome to Linux

场景二:命令替换被意外执行

# 命令替换在 heredoc 中会被执行cat << EOFCurrent date: $(date)Current user: $(whoami)EOF# 输出:# Current date: Tue Apr  7 10:00:00 CST 2026# Current user: root# 如果不想执行命令,使用转义cat << EOFCurrent date: \$(date)Current user: \$(whoami)EOF# 输出:# Current date: $(date)# Current user: $(whoami)

场景三:EOF缩进问题

# 使用不带缩进的EOFcat << EOFline oneline twoEOF# 如果需要缩进(代码规范要求),使用 <<- 允许Tab缩进    cat <<- EOF    line one    line two    EOF# 输出:# line one# line two# 注意:这里的缩进必须是Tab字符,不能是空格# 验证当前shell的Tab设置stty -a | grep tab

heredoc 高级用法脚本

#!/bin/bash# generate_config.sh - 使用heredoc生成配置文件set -euo pipefailOUTPUT_DIR="/etc/app/config"mkdir -p "$OUTPUT_DIR"# 生成主配置文件cat > "${OUTPUT_DIR}/app.conf" << 'CONF'# Application Configuration# Generated on $(date)# DO NOT EDIT MANUALLY[application]name=MyAppversion=2026.1.0environment=production[database]host=${DB_HOST:-localhost}port=${DB_PORT:-5432}name=${DB_NAME:-appdb}user=${DB_USER:-appuser}max_connections=100[logging]level=${LOG_LEVEL:-info}path=/var/log/approtation=dailyCONF# 生成环境变量示例文件cat > "${OUTPUT_DIR}/.env.example" << 'ENV'# Database ConfigurationDB_HOST=localhostDB_PORT=5432DB_NAME=appdbDB_USER=appuserDB_PASSWORD=changeme# LoggingLOG_LEVEL=info# RedisREDIS_HOST=localhostREDIS_PORT=6379ENVecho"配置文件已生成到: ${OUTPUT_DIR}"ls -la "${OUTPUT_DIR}/"

坑5:管道 grep 丢失退出码

原理分析

管道连接多个命令时,只有最后一个命令的退出码会传递给shell变量$?。这导致在前面的命令失败时,整个管道仍然返回成功(0),可能掩盖问题。

常见错误场景

场景一:grep未找到匹配时的退出码问题

# grep 未找到匹配时返回退出码 1echo"hello" | grep "world"echo"grep exit code: $?"# 输出:grep exit code: 1# 管道中只有最后一个命令的退出码有效echo"hello" | grep "world" | wc -lecho"pipeline exit code: $?"# 输出:pipeline exit code: 0 (wc的退出码)# 正确捕获中间命令的退出码set -o pipefail   # 启用后,整个管道的退出码是第一个非零命令的退出码echo"hello" | grep "world" | wc -lecho"pipeline exit code: $?"# 输出:pipeline exit code: 1 (grep的退出码)

场景二:grep 在脚本中的条件判断

#!/bin/bash# 错误写法grep "error" /var/log/app.log && echo"Found errors"# 即使grep未找到匹配,也会执行后续命令(因为&&只看最后一个命令的退出码)# 正确写法:使用 set -o pipefail#!/bin/bashset -eo pipefailgrep "error" /var/log/app.log && echo"Found errors"# 或者使用 PIPESTATUS 数组grep "error" /var/log/app.logif [ ${PIPESTATUS[0]} -eq 0 ]; thenecho"Found errors"elseecho"No errors found"fi

场景三:误用 || 导致的逻辑错误

# || 也有类似问题echo"hello" | grep "world" || echo"Not found"# 这里会输出 "Not found",看起来正常# 但在更复杂的场景中grep "error" /var/log/app.log || echo"Errors found" >> /tmp/check.log# 如果grep找到匹配,返回0,|| 后面的命令不执行# 如果grep未找到匹配,返回1,echo执行但逻辑可能不符合预期

健壮的日志检查脚本

#!/bin/bash# check_logs.sh - 健壮的日志检查脚本set -euo pipefailLOG_FILE="${1:-/var/log/app.log}"ERROR_PATTERN="${2:-error|ERROR|fatal|FATAL}"WARN_PATTERN="${3:-warn|WARN|warning|WARNING}"echo"=== 日志检查报告 ==="echo"检查文件: $LOG_FILE"echo"检查时间: $(date)"echo""# 检查文件是否存在if [ ! -f "$LOG_FILE" ]; thenecho"错误:日志文件不存在"exit 1fi# 检查错误级别ERROR_COUNT=0ERROR_LINES=$(grep -E "$ERROR_PATTERN""$LOG_FILE" 2>/dev/null) || ERROR_COUNT=$?# 使用 PIPESTATUS 正确捕获 grep 的退出码if [ ${PIPESTATUS[0]} -eq 0 ]; then    ERROR_COUNT=$(echo"$ERROR_LINES" | wc -l)echo"[严重] 发现 $ERROR_COUNT 条错误日志:"echo"$ERROR_LINES" | tail -20elseecho"[正常] 未发现错误级别日志"fiecho""# 检查警告级别WARN_COUNT=0WARN_LINES=$(grep -E "$WARN_PATTERN""$LOG_FILE" 2>/dev/null) || WARN_COUNT=$?if [ ${PIPESTATUS[0]} -eq 0 ]; then    WARN_COUNT=$(echo"$WARN_LINES" | wc -l)echo"[警告] 发现 $WARN_COUNT 条警告日志:"echo"$WARN_LINES" | tail -20elseecho"[正常] 未发现警告级别日志"fiecho""echo"=== 检查完成 ==="# 返回适当的退出码if [ $ERROR_COUNT -gt 0 ]; thenexit 2elif [ $WARN_COUNT -gt 0 ]; thenexit 1elseexit 0fi

坑6:find -exec 的安全盲区

原理分析

find -exec是强大的文件查找和批量处理工具,但特殊字符(空格、引号、换行符等)可能导致命令执行出现意外行为。2026年的GNU findutils已经改进了处理机制,但跨平台兼容性问题仍然存在。

常见错误场景

场景一:文件名包含空格导致的问题

# 创建测试文件mkdir -p /tmp/testtouch "/tmp/test/file with spaces.txt"# 错误写法:空格会导致问题find /tmp/test -name "*.txt" -exec rm -v {} \;# 输出可能显示:rm: cannot remove '/tmp/test/file'#              rm: cannot remove 'with'#              rm: cannot remove 'spaces.txt'# 正确写法:使用 -print0 和 xargsfind /tmp/test -name "*.txt" -print0 | xargs -0 rm -v# 或者使用 -exec + 结尾find /tmp/test -name "*.txt" -exec rm -v "{}" +# 或者在 {} 两侧加引号find /tmp/test -name "*.txt" -exec rm -v "{}" \;

场景二:-exec 与 -ok 的选择

# -exec 直接执行,不确认find /tmp/test -name "*.log" -exec rm {} \;# 所有匹配文件立即删除,无确认# -ok 逐个确认询问find /tmp/test -name "*.log" -ok rm {} \;# 输出:< rm ... /tmp/test/app.log > ? y#       < rm ... /tmp/test/sys.log > ? n# 每个文件都会询问是否删除# -ok 的交互性问题在脚本中无法处理# 正确做法:先预览,再执行find /tmp/test -name "*.log" -print# 预览find /tmp/test -name "*.log" -delete   # 确认后删除

场景三:跨文件系统的查找

# 默认 find 不会跨越文件系统边界(-xdev 或 -mount)find / -name "*.conf" 2>/dev/null# 可能错过 /boot、/home 等不同文件系统# 需要跨文件系统时使用 -n mount 选项find / -xdev -name "*.conf" 2>/dev/null    # 限制在同文件系统find / -mount -name "*.conf" 2>/dev/null   # 同上,兼容旧写法# 更安全的方式:指定搜索范围find /etc /var /home -name "*.conf" 2>/dev/null

find 高级应用脚本

#!/bin/bash# find_large_files.sh - 查找大文件并生成报告set -euo pipefailREPORT_FILE="/tmp/large_files_$(date +%Y%m%d_%H%M%S).txt"SIZE_THRESHOLD="${1:-100M}"# 默认查找大于100M的文件SEARCH_PATH="${2:-/}"# 默认搜索根目录echo"=== 大文件扫描报告 ===" > "$REPORT_FILE"echo"搜索路径: $SEARCH_PATH" >> "$REPORT_FILE"echo"大小阈值: $SIZE_THRESHOLD" >> "$REPORT_FILE"echo"扫描时间: $(date)" >> "$REPORT_FILE"echo"" >> "$REPORT_FILE"# 查找大文件(使用 -size 支持 K, M, G 单位)# -mtime +30 表示修改时间在30天以前# -type f 表示普通文件find "$SEARCH_PATH" \    -xdev \    -type f \    -size +"$SIZE_THRESHOLD" \    -mtime +30 \    -printf"%p|%s|%TD|%TH:%TM\n" 2>/dev/null | \while IFS='|'read -r filepath size date time; do# 转换为人类可读大小    size_human=$(numfmt --to=iec-i --suffix=B "$size")echo"${size_human} | ${date}${time} | ${filepath}" >> "$REPORT_FILE"done# 按大小排序sort -hr "$REPORT_FILE" -o "$REPORT_FILE"# 统计TOTAL_COUNT=$(($(wc -l < "$REPORT_FILE") - 5))echo"" >> "$REPORT_FILE"echo"=== 统计 ===" >> "$REPORT_FILE"echo"共发现 $TOTAL_COUNT 个大文件" >> "$REPORT_FILE"echo"建议使用: rm \$(cat $REPORT_FILE | tail -n +6 | awk '{print \$3}') 清理" >> "$REPORT_FILE"echo"报告已生成: $REPORT_FILE"cat "$REPORT_FILE"

坑7:shell 算术运算的坑

原理分析

bash的$(( ))用于整数算术运算,但涉及浮点数、进制转换、位运算时容易出错。bash不支持浮点运算,需要借助bc或awk。2026年主流发行版默认安装bc。

常见错误场景

场景一:浮点数运算

# bash 不支持浮点数echo $((10 / 3))# 输出:3(整数除法,直接截断)# 使用 bc 进行浮点运算echo"scale=2; 10 / 3" | bc# 输出:3.33# 复杂浮点运算echo"scale=6; sqrt(2)" | bc -l# 输出:1.414213# 使用 awk(推荐,跨平台兼容性好)awk 'BEGIN {printf "%.2f\n", 10/3}'# 输出:3.33

场景二:进制转换

# 十进制转其他进制echo $((16#FF))           # 16进制FF转10进制 = 255echo $((8#77))            # 8进制77转10进制 = 63echo $((2#1010))          # 2进制1010转10进制 = 10# 10进制转其他进制(需要外部工具)# 使用 printfprintf"%d\n" 255              # 十进制printf"%x\n" 255              # 十六进制(小写)printf"%X\n" 255              # 十六进制(大写)printf"%o\n" 255              # 八进制# 使用 bcecho"obase=16; 255" | bc      # 输出:FFecho"obase=2; 255" | bc       # 输出:11111111

场景三:位运算的陷阱

# 位移运算echo $((1 << 10))    # 输出:1024echo $((1024 >> 2))  # 输出:256# 位与/位或echo $((15 & 7))     # 输出:7  (1111 & 0111 = 0111)echo $((15 | 7))     # 输出:15 (1111 | 0111 = 1111)# 负数位运算(陷阱)echo $((16#FFFFFFFF))   # 可能得到意想不到的结果echo $((0xFFFFFFFF))   # 输出:-1 (在64位系统上,取决于实现)# 处理32位有符号整数functionsigned32() {local val=$1local mask=$((0xFFFFFFFF))local signed=$((val & mask))if [ $signed -ge $((1 << 31)) ]; thenecho $((signed - (1 << 32)))elseecho$signedfi}echo $(signed32 0xFFFFFFFF)   # 输出:-1

算术运算工具库脚本

#!/bin/bash# math_lib.sh - 常用数学运算函数库# 浮点数比较(返回0表示相等,1表示a>b,2表示a<b)float_compare() {local a="$1"local b="$2"local result    result=$(awk -v a="$a" -v b="$b"'BEGIN {        if (a > b) exit 1        if (a < b) exit 2        exit 0    }')return $?}# 浮点数加减乘除float_add() { awk -v a="$1" -v b="$2"'BEGIN {printf "%.2f\n", a+b}'; }float_sub() { awk -v a="$1" -v b="$2"'BEGIN {printf "%.2f\n", a-b}'; }float_mul() { awk -v a="$1" -v b="$2"'BEGIN {printf "%.2f\n", a*b}'; }float_div() { awk -v a="$1" -v b="$2"'BEGIN {if(b==0)exit 1;printf "%.4f\n", a/b}'; }# 求最大值max() {local max_val=$1shiftfor val in"$@"do        ((val > max_val)) && max_val=$valdoneecho$max_val}# 求最小值min() {local min_val=$1shiftfor val in"$@"do        ((val < min_val)) && min_val=$valdoneecho$min_val}# 求平均值average() {local sum=0local count=$#for val in"$@"do        sum=$((sum + val))doneecho $((sum / count))}# 阶乘factorial() {local n=$1local result=1for ((i=2; i<=n; i++)); do        result=$((result * i))doneecho$result}# 进制转换dec_to_hex() { printf"%X\n""$1"; }dec_to_oct() { printf"%O\n""$1"; }dec_to_bin() { echo"obase=2; $1" | bc; }hex_to_dec() { echo"$((16#$1))"; }oct_to_dec() { echo"$((8#$1))"; }bin_to_dec() { echo"$((2#$1))"; }# 测试if [ "${BASH_SOURCE[0]}" == "${0}" ]; thenecho"=== 数学库测试 ==="echo"浮点运算测试:"echo"10 + 3 = $(float_add 10 3)"echo"10 - 3 = $(float_sub 10 3)"echo"10 * 3 = $(float_mul 10 3)"echo"10 / 3 = $(float_div 10 3)"echo""echo"极值测试:"echo"max(5, 12, 3, 9) = $(max 5 12 3 9)"echo"min(5, 12, 3, 9) = $(min 5 12 3 9)"echo""echo"进制转换测试:"echo"255 (dec) = $(dec_to_hex 255) (hex)"echo"255 (dec) = $(dec_to_oct 255) (oct)"echo"255 (dec) = $(dec_to_bin 255) (bin)"fi

坑8:nohup 后台任务的误解

原理分析

nohup确保进程在终端退出后继续运行,但其输出重定向行为经常被误解。没有明确指定时,nohup会将输出重定向到nohup.out文件,如果当前目录不可写则失败。

常见错误场景

场景一:输出文件位置混乱

# 默认行为:输出到 nohup.outnohup ./long_running_script.sh &# 如果脚本在 /home/user/project 目录运行# nohup.out 会在 /home/user/project 目录,而非用户主目录# 查看 nohup.out 位置pwd && ls nohup.out# 指定输出文件nohup ./script.sh > /var/log/script.log 2>&1 &# 标准输出和标准错误都重定向到日志文件# 仅捕获错误输出nohup ./script.sh > /dev/null 2>&1 &# 完全丢弃输出

场景二:作业控制混淆

# 使用 nohup 后,jobs 命令看不到该进程nohup ./script.sh &jobs# 看不到后台任务,因为任务已经脱离当前会话# 查看真实的后台进程ps aux | grep script.sh# 或者pgrep -f script.sh# 如果需要终止pkill -f script.sh# 或者kill $(pgrep -f script.sh)

场景三:nohup 与 screen/tmux 的选择

# nohup 适合简单的后台任务nohup ./backup.sh > /var/log/backup.log 2>&1 &# 但 nohup 不能恢复会话,如果需要交互式会话,使用 screenscreen -S backup_session./interactive_backup.sh# 按 Ctrl+A D 分离会话# screen -r backup_session 恢复# tmux 是更现代的选择tmux new -s backup_session./interactive_backup.sh# 按 Ctrl+B D 分离# tmux attach -t backup_session 恢复# systemd 服务(推荐用于长期运行的服务)cat > /etc/systemd/system/backup.service << 'EOF'[Unit]Description=Backup ServiceAfter=network.target[Service]Type=simpleUser=rootExecStart=/usr/local/bin/backup.shRestart=on-failureRestartSec=10[Install]WantedBy=multi-user.targetEOFsystemctl daemon-reloadsystemctl enable backupsystemctl start backup

进程管理脚本

#!/bin/bash# run_daemon.sh - 安全的守护进程启动脚本set -euo pipefailSCRIPT_NAME="$(basename "$0")"SCRIPT_PATH="$(cd "$(dirname "$0")" && pwd)/${SCRIPT_NAME}"LOG_DIR="/var/log/${SCRIPT_NAME%.sh}"PID_DIR="/var/run/${SCRIPT_NAME%.sh}"mkdir -p "$LOG_DIR" "$PID_DIR"LOG_FILE="${LOG_DIR}/${SCRIPT_NAME%.sh}_$(date +%Y%m%d).log"PID_FILE="${PID_DIR}/${SCRIPT_NAME%.sh}.pid"start() {    if [ -f "$PID_FILE" ]; then        pid=$(cat "$PID_FILE")        if kill -0 "$pid" 2>/dev/null; then            echo "$SCRIPT_NAME 已在运行 (PID: $pid)"            return 1        fi        rm -f "$PID_FILE"    fi    echo "启动 $SCRIPT_NAME..."    nohup "$SCRIPT_PATH" >> "$LOG_FILE" 2>&1 &    echo $! > "$PID_FILE"    echo "$SCRIPT_NAME 已启动 (PID: $(cat "$PID_FILE"))"}stop() {    if [ ! -f "$PID_FILE" ]; then        echo "$SCRIPT_NAME 未运行"        return 1    fi    pid=$(cat "$PID_FILE")    echo "停止 $SCRIPT_NAME (PID: $pid)..."    if kill "$pid" 2>/dev/null; then        sleep 2        if kill -0 "$pid" 2>/dev/null; then            echo "进程未响应,强制终止..."            kill -9 "$pid"        fi    fi    rm -f "$PID_FILE"    echo "$SCRIPT_NAME 已停止"}status() {    if [ -f "$PID_FILE" ]; then        pid=$(cat "$PID_FILE")        if kill -0 "$pid" 2>/dev/null; then            echo "$SCRIPT_NAME 正在运行 (PID: $pid)"            return 0        fi    fi    echo "$SCRIPT_NAME 未运行"    return 1}restart() {    stop    sleep 1    start}case "${1:-start}" in    start)   start ;;    stop)    stop ;;    status)  status ;;    restart) restart ;;    *)       echo "用法: $0 {start|stop|status|restart}" ;;esac

坑9:环境变量引号问题

原理分析

shell中变量展开、引号嵌套、命令替换交织时,行为往往与直觉不符。理解shell的词法分析过程是解决此类问题的关键。

常见错误场景

场景一:变量包含空格

NAME="John Doe"# 错误:空格导致参数拆分echo$NAME# 输出:John Doeecho$NAME is here  # 输出:John Doe is here# 正确:加引号保留空格echo"$NAME"# 输出:John Doeecho"$NAME is here"# 输出:John Doe is here# 数组方式更安全NAMES=("John Doe""Jane Smith")echo"${NAMES[0]}"# 输出:John Doe

场景二:命令替换与引号

# 当前目录有文件 "file with spaces.txt"FILE=$(ls *.txt | head -1)echo$FILE# 单词拆分ls -l $FILE# 可能报错:找不到文件echo"$FILE"# 正确保留空格ls -l "$FILE"# 正确# 多个命令替换DATE=$(date +%Y-%m-%d)TIME=$(date +%H:%M:%S)TIMESTAMP="${DATE}_${TIME}"

场景三:转义字符处理

# 变量中的 \n 不是换行TEXT="line1\nline2"echo"$TEXT"# 输出:line1\nline2(字面量)# 需要换行时使用 $'...' 语法TEXT=$'line1\nline2'echo"$TEXT"# 输出:# line1# line2# printf 更可靠printf"%s\n""$TEXT"

环境配置管理脚本

#!/bin/bash# setup_env.sh - 环境变量配置脚本set -euo pipefailENV_FILE="${1:-.env}"export $(grep -v '^#'"$ENV_FILE" | xargs) 2>/dev/null || true# 安全读取环境变量函数get_env() {local key="$1"local default="${2:-}"local value="${!key:-}"echo"${value:-$default}"}# 数据库连接配置DB_HOST=$(get_env DB_HOST "localhost")DB_PORT=$(get_env DB_PORT "5432")DB_NAME=$(get_env DB_NAME "appdb")DB_USER=$(get_env DB_USER "appuser")DB_PASSWORD=$(get_env DB_PASSWORD "")echo"=== 环境变量检查 ==="echo"DB_HOST: $DB_HOST"echo"DB_PORT: $DB_PORT"echo"DB_NAME: $DB_NAME"echo"DB_USER: $DB_USER"# 验证必需变量if [ -z "$DB_PASSWORD" ]; thenecho"错误:DB_PASSWORD 未设置"exit 1fi# 导出组合变量export DB_URL="postgresql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}"echo"DB_URL: $DB_URL"# 使用示例:在其他脚本中 source# source setup_env.sh .env# echo $DB_HOST

坑10:ssh 远程命令执行的引号转义

原理分析

ssh执行远程命令时,本地shell和远程shell都会对命令进行解析。引号处理、变量展开、通配符展开的时机不同,导致复杂命令经常失败。

常见错误场景

场景一:本地变量未传递到远程

LOCAL_VAR="hello world"# 错误:本地变量未展开ssh user@host "echo $LOCAL_VAR"# 远程输出:空白或报错(变量未定义)# 正确:在本地展开变量ssh user@host "echo '$LOCAL_VAR'"# 远程输出:hello world# 或者使用单引号避免转义ssh user@host 'echo $LOCAL_VAR'# 但这会导致远程变量也无法使用# 最安全的方式:使用 here-documentssh user@host << 'EOF'echo"Local var: $LOCAL_VAR"echo"Remote var: $REMOTE_VAR"EOF

场景二:通配符在本地和远程的不同行为

# 创建测试文件ssh user@host "touch /tmp/file{1,2,3}.txt"# * 在本地被展开ls /tmp/file*.txt    # 本地查找ssh user@host "ls /tmp/file*.txt"# 远程查找,但 * 可能被本地shell处理# 正确:转义通配符ssh user@host 'ls /tmp/file*.txt'ssh user@host "ls /tmp/file*.txt"# 取决于引号类型# 更可靠的方式:传递文件列表FILES=$(ssh user@host "ls /tmp/file*.txt")for f in$FILESdoecho"Processing: $f"done

场景三:sudo 与 ssh 的组合

# 远程执行需要 sudo 的命令# 错误:密码交互问题ssh user@host "sudo systemctl restart nginx"# 需要配置 passwordless sudo 或使用 -S 选项# 更好的方式:使用 ssh -t 分配伪终端ssh -t user@host "sudo systemctl restart nginx"# 或者预先设置 passwordless sudo# 在 /etc/sudoers.d/ 中添加:# user ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx# 批量执行远程命令for host in server1 server2 server3; do    ssh -o ConnectTimeout=5 "$host""sudo systemctl restart nginx" &donewait

SSH 批量操作脚本

#!/bin/bash# batch_ssh.sh - SSH批量执行脚本set -euo pipefailSCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"HOSTS_FILE="${HOSTS_FILE:-${SCRIPT_DIR}/hosts.txt}"COMMAND=""PARALLEL=falseUSER="root"usage() {    cat << EOF用法: $0 [选项] "命令"选项:    -f file     主机列表文件 (默认: hosts.txt)    -u user    SSH 用户 (默认: root)    -p         并行执行 (默认: 串行)    -h         显示帮助示例:$0 -f servers.txt "systemctl status nginx"$0 -u admin -p "df -h"EOF    exit 1}while getopts "f:u:ph" opt; do    case $opt in        f) HOSTS_FILE="$OPTARG" ;;        u) USER="$OPTARG" ;;        p) PARALLEL=true ;;        h) usage ;;        *) usage ;;    esacdoneshift $((OPTIND - 1))COMMAND="$1"if [ -z "$COMMAND" ]; then    usagefiif [ ! -f "$HOSTS_FILE" ]; then    echo "错误:主机列表文件不存在: $HOSTS_FILE"    exit 1fi# 读取主机列表mapfile -t HOSTS < "$HOSTS_FILE"execute_on_host() {    local host="$1"    local user="$2"    local cmd="$3"    local timeout=30    echo ">>> $host"    if timeout "$timeout" ssh -o StrictHostKeyChecking=no \                             -o ConnectTimeout=10 \                             -o BatchMode=yes \                             "${user}@${host}" "$cmd" 2>&1; then        echo "<<< $host [成功]"        return 0    else        local exit_code=$?        echo "<<< $host [失败: $exit_code]"        return $exit_code    fi}echo "=== 批量执行: $COMMAND ==="echo "主机列表: $HOSTS_FILE"echo "主机数量: ${#HOSTS[@]}"echo ""if [ "$PARALLEL" = true ]; then    # 并行执行    for host in "${HOSTS[@]}"; do        [ -z "$host" ] && continue        execute_on_host "$host" "$USER" "$COMMAND" &    done    waitelse    # 串行执行    for host in "${HOSTS[@]}"; do        [ -z "$host" ] && continue        execute_on_host "$host" "$USER" "$COMMAND"    donefiecho ""echo "=== 执行完成 ==="

总结:运维命令安全实践清单

操作前检查

  1. 变量声明与展开检查

    # 始终对变量加引号rm -rf "${DIR}"# 删除操作前先确认路径ls -la "${DIR}"
  2. 权限最小化原则

    # 不用 root 执行日常操作# 使用 sudo 执行特定管理命令sudo systemctl restart nginx# 文件权限检查chmod 644 /etc/configfilechmod 755 /usr/local/bin/script.sh
  3. 备份策略

    # 任何删除操作前先备份cp -r /etc/nginx /etc/nginx.bak.$(date +%Y%m%d)# 使用版本控制系统管理配置文件cd /etc && git initcd /etc && etckeeper init

操作中监控

  1. 实时监控命令执行

    # 使用 watch 监控变化watch -n 1 'ls -la /tmp/dir'# 使用 strace 追踪系统调用(调试用)strace -f -e trace=execve rm -rf /tmp/test
  2. 进程与资源监控

    # 实时查看进程树pstree -p $$# 限制命令资源使用ulimit -v 1048576  # 限制虚拟内存timeout 60 command# 超时终止

操作后验证

  1. 结果验证脚本

    #!/bin/bash# verify_operation.sh - 操作验证模板set -euo pipefailecho"=== 验证操作结果 ==="# 验证文件存在if [ ! -f "/path/to/file" ]; thenecho"[失败] 文件不存在"exit 1fi# 验证权限PERMS=$(stat -c %a /path/to/file)if [ "$PERMS" != "644" ]; thenecho"[警告] 权限异常: $PERMS"fi# 验证内容if ! grep -q "expected_content""/path/to/file"thenecho"[失败] 文件内容不符"exit 1fiecho"[成功] 操作验证通过"
  2. 审计日志

    # 记录所有危险操作到审计日志export HISTTIMEFORMAT="%F %T "history | grep -E "rm|chmod|chown" >> /var/log/audit/privileged_commands

快速参考命令卡

场景
危险命令
安全替代
删除目录
rm -rf $DIRrm -rf "${DIR}"
 + 事先 ls "$DIR"
复制覆盖
cp file destcp -i file dest
 或 cp --backup=numbered
远程执行
ssh host cmdssh host 'cmd'
 或使用脚本
文件查找
find ... -exec rm {} \;find ... -print
 确认后 ... -delete
变量使用
echo $VARecho "${VAR}"
后台任务
./script &nohup ./script > log 2>&1 &

以上10个命令坑几乎涵盖了Linux日常操作中最常见的错误类型。建议读者将本文的示例在自己的测试环境中逐一实践,理解每个错误背后的原理,才能在面对复杂场景时做出正确判断。记住:在Linux中,没有回收站,没有撤销按钮,最好的防御是深入理解

文末福利

今天给大家分享一份超级牛掰的Linux学习笔记,足足有1456页!是一位Linux运维大佬整理分享的,分享是获得大佬同意的,大家有需要的尽管收藏起来!

笔记非常全面且详细,从Linux基础到shell脚本,再到防火墙、数据库、日志服务管理、Nginx、高可用集群、Redis、虚拟化、Docker等等,与其说Linux学习笔记,不如说是涵盖了运维各个核心知识。

并且图文并茂,代码清晰,每一章下面都有更具体详细的内容,十分适合Linux运维学习参考!

扫描下方二维码,回复暗号1456页Linux笔记“,即可100%免费领取成功。

听课福利

K8S小白快速入门🔥训练营!

4月8日-11日 每晚20:00

从零搭建K8S集群到实战全攻略,适合小白与IT人提升↓

限时体验价 4.99元

扫码私信老师报前10名免费听课

4月8日-11日,上课安排如下

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-04-16 17:24:07 HTTP/2.0 GET : https://f.mffb.com.cn/a/485688.html
  2. 运行时间 : 0.078625s [ 吞吐率:12.72req/s ] 内存消耗:4,727.64kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=fa2c505be0a2999e8d39a0453eed5e63
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000443s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000710s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000298s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000277s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000478s ]
  6. SELECT * FROM `set` [ RunTime:0.000589s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000525s ]
  8. SELECT * FROM `article` WHERE `id` = 485688 LIMIT 1 [ RunTime:0.001374s ]
  9. UPDATE `article` SET `lasttime` = 1776331447 WHERE `id` = 485688 [ RunTime:0.001855s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.001379s ]
  11. SELECT * FROM `article` WHERE `id` < 485688 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000398s ]
  12. SELECT * FROM `article` WHERE `id` > 485688 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000387s ]
  13. SELECT * FROM `article` WHERE `id` < 485688 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.002098s ]
  14. SELECT * FROM `article` WHERE `id` < 485688 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001060s ]
  15. SELECT * FROM `article` WHERE `id` < 485688 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001019s ]
0.080311s