91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux新手最常踩的10個命令坑介紹

馬哥Linux運維 ? 來源:馬哥Linux運維 ? 2026-04-09 10:11 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

背景與問題引入

從事運維工作十余年,帶過不少新人,發(fā)現(xiàn)有些命令錯誤幾乎是每個Linux使用者都曾經(jīng)遇到過的。這些錯誤輕則導致操作失敗、浪費時間,重則引發(fā)數(shù)據(jù)丟失、服務中斷、生產(chǎn)事故。本篇文章結合2026年最新的Linux內核特性(kernel 6.x系列)和常見發(fā)行版環(huán)境(Ubuntu 24.04 LTS、RHEL 9.4、CentOS Stream 10),系統(tǒng)梳理新手最常踩的10個命令坑,幫助讀者建立正確的操作習慣和風險意識。

文章面向初中級運維工程師,假設讀者具備基本的Linux操作經(jīng)驗,能夠登錄終端、執(zhí)行簡單命令、編輯文件。閱讀本文時,建議在測試環(huán)境中動手實踐每個案例,建立肌肉記憶。

坑1:rm -rf 的恐怖威力

原理分析

rm是Linux中最危險的標準命令之一。其核心機制是將文件的inode引用計數(shù)減1,當引用計數(shù)歸零時,文件系統(tǒng)的block位圖會標記對應數(shù)據(jù)塊為"可用",此時文件數(shù)據(jù)從用戶視角已經(jīng)不可訪問。關鍵問題在于:rm執(zhí)行后,數(shù)據(jù)塊的回收是即時的,文件系統(tǒng)不會保留任何"回收站"機制,不像Windows的回收站或者macOS的廢紙簍。

2026年的Linux發(fā)行版中,部分桌面環(huán)境(如Ubuntu 24.04的GNOME)默認對rm命令進行了別名設置,在交互式shell中會提示確認,但這僅限于桌面環(huán)境的終端模擬器。在遠程SSH會話、腳本執(zhí)行、管道操作等場景下,別名不會生效。

常見錯誤場景

場景一:變量擴展導致的誤刪

# 錯誤寫法
DIR=/tmp/logs
rm -rf$DIR # 如果DIR變量為空,rm -rf / 將刪除根目錄

# 正確寫法
DIR=/tmp/logs
rm -rf"${DIR}" # 加引號保護

# 更安全的寫法:先檢查變量是否為空
DIR=/tmp/logs
if[ -n"$DIR"];then
  rm -rf"$DIR"
else
 echo"DIR變量為空,拒絕執(zhí)行刪除"
 exit1
fi

場景二:末尾斜杠導致路徑解析錯誤

# 假設 /data/logs 是一個符號鏈接指向 /mnt/storage/logs
rm -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.log

rm -rf /data/logs/  # 行為等同于 rm -rf /data/logs/*,刪除目錄下所有文件
rm -rf /data/logs   # 刪除 logs 目錄本身,如果logs是目錄而非符號鏈接

場景三:find + exec 的不可逆刪除

# 危險寫法:空格導致災難
find /var/log-name"*.tmp"-execrm -rf {} ;
# 如果find結果中有空格或特殊字符,{} 會被拆分成多個參數(shù)

# 正確寫法
find /var/log-name"*.tmp"-execrm -rf"{}";
# 或者
find /var/log-name"*.tmp"-execrm -rf {} +
# + 結尾讓 find 批量傳遞參數(shù),減少 rm 調用次數(shù)

# 最安全的寫法:先 -print 確認目標,再執(zhí)行
find /var/log-name"*.tmp"-print
# 確認輸出無誤后,再替換為 -delete
find /var/log-name"*.tmp"-delete

最佳實踐與防御策略

策略一:啟用回收站別名

# 在 ~/.bashrc 或 ~/.zshrc 中添加
aliasrm='mv --target-directory=$HOME/.trash'
aliasrrm='rm -rf'

# 創(chuàng)建回收站目錄
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/tmp
wget https://launchpad.net/safe-rm/trunk/1.2.0/+download/safe-rm-1.2.0.tar.gz
tar -xzf safe-rm-1.2.0.tar.gz
cdsafe-rm-1.2.0
cp safe-rm /usr/local/bin/safe-rm
chmod +x /usr/local/bin/safe-rm

# 配置保護路徑
cat > /etc/safe-rm.conf <

策略三:容器環(huán)境下的數(shù)據(jù)卷保護

# Kubernetes Pod 安全上下文示例
apiVersion: v1
kind: Pod
metadata:
 name: safe-app
spec:
 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年的主流發(fā)行版中行為沒有變化,但新手經(jīng)常忽略其默認不跟隨符號鏈接的特性。grep會在指定目錄的所有文件中遞歸搜索匹配的行,輸出格式為filename:line content。

常見錯誤場景

場景一:符號鏈接目錄被忽略

# 創(chuàng)建測試環(huán)境
mkdir -p /tmp/test/code
echo"database_password=secret123"> /tmp/test/code/config.py
ln -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 中經(jīng)常包含壓縮的日志文件(.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/ -tlog    # -t 指定文件類型
rg"error"/var/log/ --no-ignore  # 忽略 .gitignore 等
rg"error"/var/log/ -j 4     # 指定并行線程數(shù)

高級搜索腳本

日志關鍵字批量搜索腳本

#!/bin/bash
# search_logs.sh - 日志批量搜索工具
# 用法:./search_logs.sh [-t type] [-d dir] [-o output] "keyword"

set-euo pipefail

SCRIPT_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 log
EOF
? ? exit 1
}

while getopts "to:h" opt; do
? ? case?$opt?in
? ? ? ? t) SEARCH_TYPE="$OPTARG" ;;
? ? ? ? d) LOG_DIR="$OPTARG" ;;
? ? ? ? o) OUTPUT_FILE="$OPTARG" ;;
? ? ? ? h) usage ;;
? ? ? ? *) usage ;;
? ? esac
done
shift?$((OPTIND - 1))
KEYWORD="http://m.makelele.cn/images/chaijie_default.png"

if [ -z "$KEYWORD" ]; then
? ? echo "錯誤:必須指定搜索關鍵字" >&2
  usage
fi

# 檢查目錄是否存在
if [ ! -d "$LOG_DIR" ]; then
  echo "錯誤:目錄不存在:$LOG_DIR" >&2
  exit 1
fi

# 執(zhí)行搜索
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 /dev/null || true
fi

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

原理分析

cp命令在默認情況下會無條件覆蓋目標文件,不會詢問確認。這是因為cp設計之初假設用戶知道自己正在做什么。在管道和腳本環(huán)境中,這一行為可能導致數(shù)據(jù)意外丟失。

常見錯誤場景

場景一:別名導致預期外的行為

# 檢查 cp 別名
aliascp
# 輸出: alias cp='cp -i'  (-i 表示 interactive,會提示確認)

# 但在腳本中,別名不會展開
#!/bin/bash
cp /source/file1 /dest/file1 # 如果有別名 cp='cp -i',會提示確認
# 在腳本中,cp 會使用原始行為,不加 -i

# 解決方案:明確使用 /bin/cp
#!/bin/bash
/bin/cp /source/file1 /dest/file1

場景二:-n 和 -i 的沖突

# 創(chuàng)建測試文件
echo"new content"> /tmp/test.txt
echo"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 # 強制覆蓋

場景三:目錄復制的深度問題

# 創(chuàng)建測試目錄結構
mkdir -p /tmp/src/subdir1/subdir2
echo"file1"> /tmp/src/file1.txt
echo"file2"> /tmp/src/subdir1/file2.txt
echo"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 -typef
# /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 pipefail

SRC="http://m.makelele.cn/images/chaijie_default.png"
DEST="$2"
BACKUP_DIR="/tmp/safe_cp_backup/$(date +%Y%m%d_%H%M%S)"

# 如果目標存在,創(chuàng)建備份
if[ -e"$DEST"];then
  mkdir -p"$BACKUP_DIR"
 echo"目標文件存在,正在創(chuàng)建備份到:$BACKUP_DIR"
  cp -r"$DEST""$BACKUP_DIR/"
fi

# 執(zhí)行復制
cp -r"$SRC""$DEST"

echo"復制完成!"
echo"源:$SRC"
echo"目標:$DEST"
[ -d"$BACKUP_DIR"] &&echo"備份:$BACKUP_DIR"

坑4:cat 與 EOF 的陷阱

原理分析

heredoc(here document)是shell中用于輸入多行文本的機制,但其中涉及多個轉義和引用規(guī)則,新手經(jīng)常在變量展開、引號處理、EOF定界符上出錯。

常見錯誤場景

場景一:變量被展開

# 變量被展開
NAME="John"
cat << EOF
Hello,?$NAME
Welcome to Linux
EOF
# 輸出:
# Hello, John
# Welcome to Linux

# 正確寫法:加引號阻止變量展開
cat <

場景二:命令替換被意外執(zhí)行

# 命令替換在 heredoc 中會被執(zhí)行
cat << EOF
Current date: $(date)
Current user: $(whoami)
EOF
# 輸出:
# Current date: Tue Apr ?7 1000 CST 2026
# Current user: root

# 如果不想執(zhí)行命令,使用轉義
cat << EOF
Current date: $(date)
Current user: $(whoami)
EOF
# 輸出:
# Current date: $(date)
# Current user: $(whoami)

場景三:EOF縮進問題

# 使用不帶縮進的EOF
cat << EOF
line one
line two
EOF

# 如果需要縮進(代碼規(guī)范要求),使用 <<- 允許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 pipefail

OUTPUT_DIR="/etc/app/config"
mkdir -p"$OUTPUT_DIR"

# 生成主配置文件
cat >"${OUTPUT_DIR}/app.conf"<"${OUTPUT_DIR}/.env.example"<

坑5:管道 grep 丟失退出碼

原理分析

管道連接多個命令時,只有最后一個命令的退出碼會傳遞給shell變量$?。這導致在前面的命令失敗時,整個管道仍然返回成功(0),可能掩蓋問題。

常見錯誤場景

場景一:grep未找到匹配時的退出碼問題

# grep 未找到匹配時返回退出碼 1
echo"hello"| grep"world"
echo"grep exit code: $?" # 輸出:grep exit code: 1

# 管道中只有最后一個命令的退出碼有效
echo"hello"| grep"world"| wc -l
echo"pipeline exit code: $?" # 輸出:pipeline exit code: 0 (wc的退出碼)

# 正確捕獲中間命令的退出碼
set-o pipefail # 啟用后,整個管道的退出碼是第一個非零命令的退出碼
echo"hello"| grep"world"| wc -l
echo"pipeline exit code: $?" # 輸出:pipeline exit code: 1 (grep的退出碼)

場景二:grep 在腳本中的條件判斷

#!/bin/bash
# 錯誤寫法
grep"error"/var/log/app.log &&echo"Found errors"
# 即使grep未找到匹配,也會執(zhí)行后續(xù)命令(因為&&只看最后一個命令的退出碼)

# 正確寫法:使用 set -o pipefail
#!/bin/bash
set-eo pipefail
grep"error"/var/log/app.log &&echo"Found errors"
# 或者使用 PIPESTATUS 數(shù)組
grep"error"/var/log/app.log
if[${PIPESTATUS[0]}-eq 0 ];then
 echo"Found errors"
else
 echo"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,|| 后面的命令不執(zhí)行
# 如果grep未找到匹配,返回1,echo執(zhí)行但邏輯可能不符合預期

健壯的日志檢查腳本

#!/bin/bash
# check_logs.sh - 健壯的日志檢查腳本

set-euo pipefail

LOG_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"];then
 echo"錯誤:日志文件不存在"
 exit1
fi

# 檢查錯誤級別
ERROR_COUNT=0
ERROR_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"[嚴重] 發(fā)現(xiàn)$ERROR_COUNT條錯誤日志:"
 echo"$ERROR_LINES"| tail -20
else
 echo"[正常] 未發(fā)現(xiàn)錯誤級別日志"
fi

echo""

# 檢查警告級別
WARN_COUNT=0
WARN_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"[警告] 發(fā)現(xiàn)$WARN_COUNT條警告日志:"
 echo"$WARN_LINES"| tail -20
else
 echo"[正常] 未發(fā)現(xiàn)警告級別日志"
fi

echo""
echo"=== 檢查完成 ==="

# 返回適當?shù)耐顺龃a
if[$ERROR_COUNT-gt 0 ];then
 exit2
elif[$WARN_COUNT-gt 0 ];then
 exit1
else
 exit0
fi

坑6:find -exec 的安全盲區(qū)

原理分析

find -exec是強大的文件查找和批量處理工具,但特殊字符(空格、引號、換行符等)可能導致命令執(zhí)行出現(xiàn)意外行為。2026年的GNU findutils已經(jīng)改進了處理機制,但跨平臺兼容性問題仍然存在。

常見錯誤場景

場景一:文件名包含空格導致的問題

# 創(chuàng)建測試文件
mkdir -p /tmp/test
touch"/tmp/test/file with spaces.txt"

# 錯誤寫法:空格會導致問題
find /tmp/test-name"*.txt"-execrm -v {} ;
# 輸出可能顯示:rm: cannot remove '/tmp/test/file'
#       rm: cannot remove 'with'
#       rm: cannot remove 'spaces.txt'

# 正確寫法:使用 -print0 和 xargs
find /tmp/test-name"*.txt"-print0 | xargs -0 rm -v
# 或者使用 -exec + 結尾
find /tmp/test-name"*.txt"-execrm -v"{}"+
# 或者在 {} 兩側加引號
find /tmp/test-name"*.txt"-execrm -v"{}";

場景二:-exec 與 -ok 的選擇

# -exec 直接執(zhí)行,不確認
find /tmp/test-name"*.log"-execrm {} ;
# 所有匹配文件立即刪除,無確認

# -ok 逐個確認詢問
find /tmp/test-name"*.log"-ok rm {} ;
# 輸出:< rm ... /tmp/test/app.log > ? y
#    < rm ... /tmp/test/sys.log > ? n
# 每個文件都會詢問是否刪除

# -ok 的交互性問題在腳本中無法處理
# 正確做法:先預覽,再執(zhí)行
find /tmp/test-name"*.log"-print # 預覽
find /tmp/test-name"*.log"-delete # 確認后刪除

場景三:跨文件系統(tǒng)的查找

# 默認 find 不會跨越文件系統(tǒng)邊界(-xdev 或 -mount)
find / -name"*.conf"2>/dev/null
# 可能錯過 /boot、/home 等不同文件系統(tǒng)

# 需要跨文件系統(tǒng)時使用 -n mount 選項
find / -xdev -name"*.conf"2>/dev/null  # 限制在同文件系統(tǒng)
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 pipefail

REPORT_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 
  -typef 
  -size +"$SIZE_THRESHOLD"
  -mtime +30 
  -printf"%p|%s|%TD|%TH:%TM
"2>/dev/null | 
whileIFS='|'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"

# 統(tǒng)計
TOTAL_COUNT=$(($(wc -l >"$REPORT_FILE"
echo"=== 統(tǒng)計 ===">>"$REPORT_FILE"
echo"共發(fā)現(xiàn)$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的$(( ))用于整數(shù)算術運算,但涉及浮點數(shù)、進制轉換、位運算時容易出錯。bash不支持浮點運算,需要借助bc或awk。2026年主流發(fā)行版默認安裝bc。

常見錯誤場景

場景一:浮點數(shù)運算

# bash 不支持浮點數(shù)
echo$((10 / 3))
# 輸出:3(整數(shù)除法,直接截斷)

# 使用 bc 進行浮點運算
echo"scale=2; 10 / 3"| bc
# 輸出:3.33

# 復雜浮點運算
echo"scale=6; sqrt(2)"| bc -l
# 輸出:1.414213

# 使用 awk(推薦,跨平臺兼容性好)
awk'BEGIN {printf "%.2f
", 10/3}'
# 輸出:3.33

場景二:進制轉換

# 十進制轉其他進制
echo$((16#FF))      # 16進制FF轉10進制 = 255
echo$((8#77))      # 8進制77轉10進制 = 63
echo$((2#1010))     # 2進制1010轉10進制 = 10

# 10進制轉其他進制(需要外部工具)
# 使用 printf
printf"%d
"255       # 十進制
printf"%x
"255       # 十六進制(小寫)
printf"%X
"255       # 十六進制(大寫)
printf"%o
"255       # 八進制

# 使用 bc
echo"obase=16; 255"| bc   # 輸出:FF
echo"obase=2; 255"| bc   # 輸出:11111111

場景三:位運算的陷阱

# 位移運算
echo$((1 << 10)) ? ?# 輸出:1024
echo?$((1024 >> 2)) # 輸出:256

# 位與/位或
echo$((15 & 7))  # 輸出:7 (1111 & 0111 = 0111)
echo$((15 | 7))  # 輸出:15 (1111 | 0111 = 1111)

# 負數(shù)位運算(陷阱)
echo$((16#FFFFFFFF))  # 可能得到意想不到的結果
echo$((0xFFFFFFFF)) # 輸出:-1 (在64位系統(tǒng)上,取決于實現(xiàn))

# 處理32位有符號整數(shù)
functionsigned32() {
 localval=http://m.makelele.cn/images/chaijie_default.png
 localmask=$((0xFFFFFFFF))
 localsigned=$((val & mask))
 if[$signed-ge $((1 << 31)) ];?then
? ? ? ??echo?$((signed - (1 << 32)))
? ??else
? ? ? ??echo?$signed
? ??fi
}
echo?$(signed32 0xFFFFFFFF) ??# 輸出:-1

算術運算工具庫腳本

#!/bin/bash
# math_lib.sh - 常用數(shù)學運算函數(shù)庫

# 浮點數(shù)比較(返回0表示相等,1表示a>b,2表示a b) exit 1
    if (a < b) exit 2
? ? ? ? exit 0
? ? }')
? ??return?$?
}

# 浮點數(shù)加減乘除
float_add() { awk -v a="http://m.makelele.cn/images/chaijie_default.png"?-v b="$2"?'BEGIN {printf "%.2f
", a+b}'; }
float_sub() { awk -v a="http://m.makelele.cn/images/chaijie_default.png"?-v b="$2"?'BEGIN {printf "%.2f
", a-b}'; }
float_mul() { awk -v a="http://m.makelele.cn/images/chaijie_default.png"?-v b="$2"?'BEGIN {printf "%.2f
", a*b}'; }
float_div() { awk -v a="http://m.makelele.cn/images/chaijie_default.png"?-v b="$2"?'BEGIN {if(b==0)exit 1;printf "%.4f
", a/b}'; }

# 求最大值
max() {
? ??local?max_val=http://m.makelele.cn/images/chaijie_default.png
? ??shift
? ??for?val?in?"$@";?do
? ? ? ? ((val > max_val)) && max_val=$val
 done
 echo$max_val
}

# 求最小值
min() {
 localmin_val=http://m.makelele.cn/images/chaijie_default.png
 shift
 forvalin"$@";do
    ((val < min_val)) && min_val=$val
? ??done
? ??echo?$min_val
}

# 求平均值
average() {
? ??local?sum=0
? ??local?count=$#
? ??for?val?in?"$@";?do
? ? ? ? sum=$((sum + val))
? ??done
? ??echo?$((sum / count))
}

# 階乘
factorial() {
? ??local?n=http://m.makelele.cn/images/chaijie_default.png
? ??local?result=1
? ??for?((i=2; i<=n; i++));?do
? ? ? ? result=$((result * i))
? ??done
? ??echo?$result
}

# 進制轉換
dec_to_hex() {?printf?"%X
"?"http://m.makelele.cn/images/chaijie_default.png"; }
dec_to_oct() {?printf?"%O
"?"http://m.makelele.cn/images/chaijie_default.png"; }
dec_to_bin() {?echo?"obase=2;?http://m.makelele.cn/images/chaijie_default.png"?| bc; }
hex_to_dec() {?echo?"$((16#http://m.makelele.cn/images/chaijie_default.png))"; }
oct_to_dec() {?echo?"$((8#http://m.makelele.cn/images/chaijie_default.png))"; }
bin_to_dec() {?echo?"$((2#http://m.makelele.cn/images/chaijie_default.png))"; }

# 測試
if?[?"${BASH_SOURCE[0]}"?==?"${0}"?];?then
? ??echo?"=== 數(shù)學庫測試 ==="
? ??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確保進程在終端退出后繼續(xù)運行,但其輸出重定向行為經(jīng)常被誤解。沒有明確指定時,nohup會將輸出重定向到nohup.out文件,如果當前目錄不可寫則失敗。

常見錯誤場景

場景一:輸出文件位置混亂

# 默認行為:輸出到 nohup.out
nohup ./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 &
# 完全丟棄輸出

場景二:作業(yè)控制混淆

# 使用 nohup 后,jobs 命令看不到該進程
nohup ./script.sh &
jobs # 看不到后臺任務,因為任務已經(jīng)脫離當前會話

# 查看真實的后臺進程
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 不能恢復會話,如果需要交互式會話,使用 screen
screen -S backup_session
./interactive_backup.sh
# 按 Ctrl+A D 分離會話
# screen -r backup_session 恢復

# tmux 是更現(xiàn)代的選擇
tmux new -s backup_session
./interactive_backup.sh
# 按 Ctrl+B D 分離
# tmux attach -t backup_session 恢復

# systemd 服務(推薦用于長期運行的服務)
cat > /etc/systemd/system/backup.service <

進程管理腳本

#!/bin/bash
# run_daemon.sh - 安全的守護進程啟動腳本

set-euo pipefail

SCRIPT_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:環(huán)境變量引號問題

原理分析

shell中變量展開、引號嵌套、命令替換交織時,行為往往與直覺不符。理解shell的詞法分析過程是解決此類問題的關鍵。

常見錯誤場景

場景一:變量包含空格

NAME="John Doe"

# 錯誤:空格導致參數(shù)拆分
echo$NAME    # 輸出:John Doe
echo$NAMEis here # 輸出:John Doe is here

# 正確:加引號保留空格
echo"$NAME"   # 輸出:John Doe
echo"$NAMEis here"# 輸出:John Doe is here

# 數(shù)組方式更安全
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}"

場景三:轉義字符處理

# 變量中的 
 不是換行
TEXT="line1
line2"
echo"$TEXT"    # 輸出:line1
line2(字面量)

# 需要換行時使用 $'...' 語法
TEXT=$'line1
line2'
echo"$TEXT"    # 輸出:
# line1
# line2

# printf 更可靠
printf"%s
""$TEXT"

環(huán)境配置管理腳本

#!/bin/bash
# setup_env.sh - 環(huán)境變量配置腳本

set-euo pipefail

ENV_FILE="${1:-.env}"
export$(grep -v'^#'"$ENV_FILE"| xargs) 2>/dev/null ||true

# 安全讀取環(huán)境變量函數(shù)
get_env() {
 localkey="http://m.makelele.cn/images/chaijie_default.png"
 localdefault="${2:-}"
 localvalue="${!key:-}"
 echo"${value:-$default}"
}

# 數(shù)據(jù)庫連接配置
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"=== 環(huán)境變量檢查 ==="
echo"DB_HOST:$DB_HOST"
echo"DB_PORT:$DB_PORT"
echo"DB_NAME:$DB_NAME"
echo"DB_USER:$DB_USER"

# 驗證必需變量
if[ -z"$DB_PASSWORD"];then
 echo"錯誤:DB_PASSWORD 未設置"
 exit1
fi

# 導出組合變量
exportDB_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 遠程命令執(zhí)行的引號轉義

原理分析

ssh執(zhí)行遠程命令時,本地shell和遠程shell都會對命令進行解析。引號處理、變量展開、通配符展開的時機不同,導致復雜命令經(jīng)常失敗。

常見錯誤場景

場景一:本地變量未傳遞到遠程

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-document
ssh user@host <

場景二:通配符在本地和遠程的不同行為

# 創(chuàng)建測試文件
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")
forfin$FILES;do
 echo"Processing:$f"
done

場景三:sudo 與 ssh 的組合

# 遠程執(zhí)行需要 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

# 批量執(zhí)行遠程命令
forhostinserver1 server2 server3;do
  ssh -o ConnectTimeout=5"$host""sudo systemctl restart nginx"&
done
wait

SSH 批量操作腳本

#!/bin/bash
# batch_ssh.sh - SSH批量執(zhí)行腳本

set-euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")"&&pwd)"
HOSTS_FILE="${HOSTS_FILE:-${SCRIPT_DIR}/hosts.txt}"
COMMAND=""
PARALLEL=false
USER="root"

usage() {
  cat << EOF
用法:?$0?[選項] "命令"
選項:
? ? -f file ? ? 主機列表文件 (默認: hosts.txt)
? ? -u user ? ?SSH 用戶 (默認: root)
? ? -p ? ? ? ? 并行執(zhí)行 (默認: 串行)
? ? -h ? ? ? ? 顯示幫助
示例:
? ??$0?-f servers.txt "systemctl status nginx"
? ??$0?-u admin -p "df -h"
EOF
? ? exit 1
}

while getopts "fph" opt; do
? ? case?$opt?in
? ? ? ? f) HOSTS_FILE="$OPTARG" ;;
? ? ? ? u) USER="$OPTARG" ;;
? ? ? ? p) PARALLEL=true ;;
? ? ? ? h) usage ;;
? ? ? ? *) usage ;;
? ? esac
done
shift?$((OPTIND - 1))
COMMAND="http://m.makelele.cn/images/chaijie_default.png"

if [ -z "$COMMAND" ]; then
? ? usage
fi

if [ ! -f "$HOSTS_FILE" ]; then
? ? echo "錯誤:主機列表文件不存在:?$HOSTS_FILE"
? ? exit 1
fi

# 讀取主機列表
mapfile -t HOSTS < "$HOSTS_FILE"

execute_on_host() {
? ? local host="http://m.makelele.cn/images/chaijie_default.png"
? ? 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 "<<

總結:運維命令安全實踐清單

操作前檢查

變量聲明與展開檢查

# 始終對變量加引號
rm -rf"${DIR}"
# 刪除操作前先確認路徑
ls -la"${DIR}"

權限最小化原則

# 不用 root 執(zhí)行日常操作
# 使用 sudo 執(zhí)行特定管理命令
sudo systemctl restart nginx

# 文件權限檢查
chmod 644 /etc/configfile
chmod 755 /usr/local/bin/script.sh

備份策略

# 任何刪除操作前先備份
cp -r /etc/nginx /etc/nginx.bak.$(date +%Y%m%d)

# 使用版本控制系統(tǒng)管理配置文件
cd/etc && git init
cd/etc && etckeeper init

操作中監(jiān)控

實時監(jiān)控命令執(zhí)行

# 使用 watch 監(jiān)控變化
watch -n 1'ls -la /tmp/dir'

# 使用 strace 追蹤系統(tǒng)調用(調試用)
strace -f -e trace=execve rm -rf /tmp/test

進程與資源監(jiān)控

# 實時查看進程樹
pstree -p $$

# 限制命令資源使用
ulimit-v 1048576 # 限制虛擬內存
timeout 60command# 超時終止

操作后驗證

結果驗證腳本

#!/bin/bash
# verify_operation.sh - 操作驗證模板

set-euo pipefail

echo"=== 驗證操作結果 ==="

# 驗證文件存在
if[ ! -f"/path/to/file"];then
 echo"[失敗] 文件不存在"
 exit1
fi

# 驗證權限
PERMS=$(stat-c %a /path/to/file)
if["$PERMS"!="644"];then
 echo"[警告] 權限異常:$PERMS"
fi

# 驗證內容
if! grep -q"expected_content""/path/to/file";then
 echo"[失敗] 文件內容不符"
 exit1
fi

echo"[成功] 操作驗證通過"

審計日志

# 記錄所有危險操作到審計日志
exportHISTTIMEFORMAT="%F %T "
history| grep -E"rm|chmod|chown">> /var/log/audit/privileged_commands

快速參考命令卡

場景 危險命令 安全替代
刪除目錄 rm -rf $DIR rm -rf "${DIR}" + 事先ls "$DIR"
復制覆蓋 cp file dest cp -i file dest 或cp --backup=numbered
遠程執(zhí)行 ssh host cmd ssh host 'cmd' 或使用腳本
文件查找 find ... -exec rm {} ; find ... -print 確認后... -delete
變量使用 echo $VAR echo "${VAR}"
后臺任務 ./script & nohup ./script > log 2>&1 &

以上10個命令坑幾乎涵蓋了Linux日常操作中最常見的錯誤類型。建議讀者將本文的示例在自己的測試環(huán)境中逐一實踐,理解每個錯誤背后的原理,才能在面對復雜場景時做出正確判斷。記?。涸贚inux中,沒有回收站,沒有撤銷按鈕,最好的防御是深入理解。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 內核
    +關注

    關注

    4

    文章

    1473

    瀏覽量

    43076
  • Linux
    +關注

    關注

    88

    文章

    11798

    瀏覽量

    219388
  • 命令
    +關注

    關注

    5

    文章

    758

    瀏覽量

    23886

原文標題:Linux 新手最常踩的 10 個命令坑,你中過幾個?

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    linux入門級常用命令介紹

    新手從win系統(tǒng)上轉移到linux系統(tǒng)上一比較大的障礙是linux命令行操作
    發(fā)表于 07-07 14:42 ?776次閱讀
    <b class='flag-5'>linux</b>入門級常用<b class='flag-5'>命令</b><b class='flag-5'>介紹</b>

    最常用的Linux命令盤點

    玩過Linux的人都會知道,Linux中的命令的確是非常多,但是玩過Linux的人也從來不會因為Linux
    發(fā)表于 07-11 08:21

    NodeMCU開發(fā)板經(jīng)歷分享

    寫在前面今天入手了一NodeMCU的板子,準備學習一下物聯(lián)網(wǎng)相關的知識。不過由于博主學藝不精,在第一步燒寫固件上就了,所以就想著把自己的
    發(fā)表于 11-01 07:55

    Linux學習過程過的與如何解決

    Linux記錄記錄Linux學習過程過的與如何解決
    發(fā)表于 11-04 08:44

    移植debian系統(tǒng)過的

    基本的linux系統(tǒng),板子的交叉編譯器是arm-linux-gnueabihf-gcc,這給我?guī)砹瞬簧俚穆闊?,以至于想重新移植一下debian系統(tǒng)。ok,轉入正題,說說這兩天我
    發(fā)表于 12-14 08:42

    你不可不知的11Linux命令

    Linux命令行吸引了大多數(shù)Linux愛好者。一正常的Linux用戶一般掌握大約50-60
    發(fā)表于 11-09 12:14 ?2612次閱讀
    你不可不知的11<b class='flag-5'>個</b><b class='flag-5'>Linux</b><b class='flag-5'>命令</b>

    linux最常用的20命令介紹

    Linux是一種自由和開放源代碼的類UNIX操作系統(tǒng)。該操作系統(tǒng)的內核由林納斯·托瓦茲在1991年10月5日首次發(fā)布。,在加上用戶空間的應用程序之后,成為Linux操作系統(tǒng)。Linux
    發(fā)表于 12-15 15:46 ?8538次閱讀

    Linux中的35find命令用法

    Linux查找命令Linux系統(tǒng)中最重要和最常用的命令之一。查找用于根據(jù)與參數(shù)匹配的文件指定的條件來搜索和查找文件和目錄列表的
    的頭像 發(fā)表于 02-02 16:53 ?4491次閱讀
    <b class='flag-5'>Linux</b>中的35<b class='flag-5'>個</b>find<b class='flag-5'>命令</b>用法

    嵌入式Linux記錄

    Linux記錄記錄Linux學習過程過的與如何解決
    發(fā)表于 11-01 17:21 ?10次下載
    嵌入式<b class='flag-5'>Linux</b><b class='flag-5'>踩</b><b class='flag-5'>坑</b>記錄

    STM32CubeIDE+FREERTOS記錄

    STM32CubeIDE+FREERTOS記錄
    發(fā)表于 12-05 18:06 ?15次下載
    STM32CubeIDE+FREERTOS<b class='flag-5'>踩</b><b class='flag-5'>坑</b>記錄

    29你必須知道的Linux命令

    如果你是一新手,并嘗試使用命令行接口,我們收集了各種基本的Linux命令來供你學習,幫你在各種Linu
    的頭像 發(fā)表于 12-09 10:34 ?1342次閱讀

    Linux系統(tǒng)中的10常用的文本查看命令

    當你需要查看Linux系統(tǒng)中的文本文件時,使用文本編輯器可能會比較繁瑣,特別是當你只需要查看文件的內容時。這時,你可以使用Linux命令行下的文本查看工具來快速準確地查看文件。下面介紹
    的頭像 發(fā)表于 06-24 11:44 ?1.2w次閱讀

    搭建D1s RT-Smart開發(fā)環(huán)境筆記

    作為一linux新手想要嘗試RT-Smart的開發(fā),但是網(wǎng)上教程前輩們的linux環(huán)境都是已經(jīng)相對完備的,因此像我這樣新手在搭建環(huán)境時常常
    的頭像 發(fā)表于 09-28 16:26 ?1568次閱讀
    搭建D1s RT-Smart開發(fā)環(huán)境<b class='flag-5'>踩</b><b class='flag-5'>坑</b>筆記

    linux查看物理接口的命令

    Linux操作系統(tǒng)提供了多種命令和工具來查看物理接口。在這篇文章中,我們將詳細介紹一些最常用和常見的命令,以及它們的用法和輸出。 ifcon
    的頭像 發(fā)表于 11-16 16:48 ?2693次閱讀

    推挽電路的,你過沒?

    推挽電路的,你過沒?
    的頭像 發(fā)表于 11-24 16:25 ?2042次閱讀
    推挽電路的<b class='flag-5'>坑</b>,你<b class='flag-5'>踩</b>過沒?