shell 命令
- 1. 基礎文件操作命令
- 1.1 `ls` - 列出目錄內容
- 1.2 `find` - 文件搜索
- 2. 版本控制命令
- 2.1 `git` - 版本控制系統
- 2.2 高級 Git 操作
- 3. 文本搜索命令
- 3.1 `grep` - 文本搜索
- 3.2 高級搜索技巧
- 4. Android 構建系統命令
- 4.1 `source` - 加載環境變量
- 4.2 `lunch` - 選擇構建目標
- 4.3 `m` - Android 構建命令
- 5. 目錄操作命令
- 5.1 `cd` - 切換目錄
- 6. 完整的項目開發工作流
- 6.1 日常開發流程
- 6.2 調試和問題排查流程
- 7. 高級技巧和最佳實踐
- 7.1 自動化腳本示例
- 7.2 常用別名設置
- 7.3 監控和日志分析
- 8. 故障排除指南
- 8.1 常見問題解決
- 8.2 性能優化
- 9. 項目特定命令詳解
- 9.1 固件查找命令
- 9.2 構建產物管理
- 9.3 源代碼分析
- 10. 開發環境配置
- 10.1 環境變量設置
- 10.2 工具鏈配置
- 11. 版本控制和協作
- 11.1 分支管理策略
- 11.2 代碼審查流程
- 12. 構建和部署
- 12.1 自動化構建腳本
- 12.2 部署腳本
- 13. 總結
- 13.1 關鍵要點
- 13.2 最佳實踐
1. 基礎文件操作命令
1.1 ls
- 列出目錄內容
基本用法:
ls # 列出當前目錄文件
ls -la # 列出所有文件(包括隱藏文件)的詳細信息
ls -lh # 以人類可讀格式顯示文件大小
ls -lt # 按修改時間排序
ls -R # 遞歸列出子目錄內容
項目場景應用:
# 查看項目根目錄結構
ls -la /home/share/primary/project_dev/camera_project/# 查看構建輸出目錄
ls -lh out/target/product/*/# 查看源代碼目錄
ls -R src/
1.2 find
- 文件搜索
基本用法:
find . -name "*.c" # 查找所有.c文件
find . -type f -name "*.h" # 查找所有.h文件
find . -mtime -7 # 查找7天內修改的文件
find . -size +100M # 查找大于100MB的文件
find . -exec grep -l "pattern" {} \; # 在文件中搜索內容
項目場景應用:
# 查找固件文件
find . -name "*.bin" -o -name "*.img"# 查找配置文件
find . -name "*.conf" -o -name "*.config"# 查找特定模塊的源文件
find . -path "*/kernel/*" -name "*.c"# 查找最近修改的構建文件
find out/ -type f -mtime -1
2. 版本控制命令
2.1 git
- 版本控制系統
基本用法:
git status # 查看工作區狀態,顯示哪些文件被修改、添加或刪除
git diff # 查看未提交的修改,顯示工作區與暫存區的差異
git log # 查看提交歷史,顯示所有提交記錄
git branch # 查看分支列表,顯示本地分支
git checkout <branch> # 切換分支,切換到指定的分支
git add . # 添加所有文件到暫存區,準備提交
git commit -m "message" # 提交更改,將暫存區的更改提交到本地倉庫
git pull # 拉取遠程更新,從遠程倉庫獲取最新代碼
git push # 推送到遠程倉庫,將本地提交推送到遠程
項目場景應用:
# 查看當前工作狀態
git status # 檢查哪些文件被修改,哪些文件已暫存
git diff HEAD~1 # 查看與上次提交的差異,比較當前工作區與上一次提交# 分支管理
git branch -a # 查看所有分支(包括遠程),顯示本地和遠程分支列表
git checkout -b feature/new-module # 創建并切換到新分支,用于開發新功能
git merge develop # 合并develop分支,將develop分支的更改合并到當前分支# 提交工作
git add . # 將所有修改的文件添加到暫存區
git commit -m "feat: add new camera module support" # 提交更改并添加描述信息
git push origin feature/new-module # 將本地分支推送到遠程倉庫
2.2 高級 Git 操作
# 查看文件歷史
git log --follow -- filename.c # 查看特定文件的完整修改歷史,包括重命名# 查看特定提交的詳細信息
git show <commit-hash> # 顯示指定提交的詳細信息和文件變更# 撤銷最后一次提交
git reset --soft HEAD~1 # 撤銷最后一次提交,但保留修改在暫存區# 查看分支圖
git log --graph --oneline --all # 以圖形方式顯示分支和提交歷史# 暫存當前工作
git stash # 暫存當前工作區的修改,保存到臨時區域
git stash pop # 恢復之前暫存的工作,從臨時區域恢復修改
3. 文本搜索命令
3.1 grep
- 文本搜索
基本用法:
grep "pattern" file.txt # 在文件中搜索指定模式
grep -r "pattern" directory/ # 遞歸搜索目錄中的所有文件
grep -n "pattern" file.txt # 顯示行號,顯示匹配行的行號
grep -i "pattern" file.txt # 忽略大小寫,不區分大小寫搜索
grep -v "pattern" file.txt # 反向匹配,顯示不匹配的行
grep -l "pattern" *.c # 只顯示文件名,只顯示包含匹配的文件名
項目場景應用:
# 搜索配置相關代碼
grep -nr "configure" src/ # 遞歸搜索src目錄中所有包含"configure"的文件
grep -r "CONFIG_" . --include="*.c" --include="*.h" # 搜索所有.c和.h文件中的CONFIG_定義# 搜索錯誤處理代碼
grep -r "error\|ERROR" src/ # 搜索所有包含error或ERROR的文件# 搜索特定函數定義
grep -r "function_name" . --include="*.c" # 搜索特定函數的定義# 搜索調試信息
grep -r "DEBUG\|debug" . --include="*.c" # 搜索所有調試相關的代碼
3.2 高級搜索技巧
# 使用正則表達式搜索
grep -E "pattern1|pattern2" file.txt # 使用擴展正則表達式,匹配多個模式# 搜索并顯示上下文
grep -A 3 -B 3 "pattern" file.txt # 顯示匹配行前后3行的上下文# 排除特定目錄
grep -r "pattern" . --exclude-dir=build # 搜索時排除build目錄# 統計匹配次數
grep -c "pattern" file.txt # 統計文件中匹配模式的行數
4. Android 構建系統命令
4.1 source
- 加載環境變量
基本用法:
source build_envsetup.sh # 加載構建環境,執行腳本并設置環境變量
source build/envsetup.sh # 加載Android構建環境,設置Android構建相關變量
source ~/.bashrc # 重新加載bash配置,刷新shell環境變量
項目場景應用:
# 完整的構建環境設置流程
cd /home/share/primary/project_dev/camera_project # 切換到項目目錄
source build_envsetup.sh # 加載項目特定的構建環境
source build/envsetup.sh # 加載Android標準構建環境
export PATH=$PATH:/path/to/tools # 添加工具路徑到環境變量
export ANDROID_BUILD_TOP=$(pwd) # 設置Android構建根目錄
4.2 lunch
- 選擇構建目標
基本用法:
lunch 10 # 選擇目標10,選擇預定義的構建目標
lunch # 交互式選擇目標,顯示所有可用目標供選擇
lunch aosp_arm64-eng # 選擇特定目標,直接指定構建目標
項目場景應用:
# 查看可用目標
lunch # 顯示所有可用的構建目標列表# 選擇開發目標
lunch 10 # 選擇目標10,通常對應aosp_arm64-eng開發版本# 驗證選擇
echo $TARGET_PRODUCT # 顯示當前選擇的目標產品
echo $TARGET_BUILD_VARIANT # 顯示當前選擇的構建變體
4.3 m
- Android 構建命令
基本用法:
m clean_all # 清理所有構建產物,刪除所有編譯生成的文件
m all # 構建所有模塊,編譯整個系統
m release # 構建發布版本,生成優化后的發布版本
m -j8 # 使用8個線程構建,并行編譯提高速度
m module_name # 構建特定模塊,只編譯指定的模塊
項目場景應用:
# 完整的構建流程
m clean_all # 清理之前的構建產物,確保干凈的構建環境
m all # 完整構建,編譯所有必要的模塊
m release # 構建發布版本,生成最終的產品鏡像# 增量構建
m -j$(nproc) # 使用所有CPU核心,最大化并行編譯效率
m module_name -j4 # 構建特定模塊,使用4個線程編譯指定模塊# 調試構建
m DEBUG=1 all # 啟用調試信息,編譯時包含調試符號
5. 目錄操作命令
5.1 cd
- 切換目錄
基本用法:
cd /path/to/directory # 切換到指定目錄,改變當前工作目錄
cd .. # 返回上級目錄,移動到父目錄
cd ~ # 返回家目錄,移動到用戶主目錄
cd - # 返回上次訪問的目錄,在最近兩個目錄間切換
項目場景應用:
# 項目導航
cd /home/share/primary/project_dev/camera_project # 切換到項目根目錄
cd src/ # 進入源代碼目錄
cd kernel/ # 進入內核源碼目錄
cd drivers/camera/ # 進入攝像頭驅動目錄
6. 完整的項目開發工作流
6.1 日常開發流程
# 1. 進入項目目錄
cd /home/share/primary/project_dev/camera_project # 切換到項目工作目錄# 2. 檢查Git狀態
git status # 查看當前工作區狀態,檢查哪些文件被修改
git diff # 查看未提交的修改,顯示具體的代碼變更# 3. 更新代碼
git pull origin develop # 從遠程develop分支拉取最新代碼# 4. 設置構建環境
source build_envsetup.sh # 加載項目構建環境變量
source build/envsetup.sh # 加載Android標準構建環境
lunch 10 # 選擇構建目標10# 5. 清理并構建
m clean_all # 清理之前的構建產物
m all # 完整構建項目# 6. 查找構建產物
find . -name "*.bin" -o -name "*.img" # 查找生成的固件和鏡像文件# 7. 提交更改
git add . # 將所有修改添加到暫存區
git commit -m "feat: update camera module" # 提交更改并添加描述
git push origin feature/camera-update # 推送到遠程分支
6.2 調試和問題排查流程
# 1. 檢查構建錯誤
m all 2>&1 | tee build.log # 構建項目并將輸出保存到日志文件# 2. 搜索錯誤信息
grep -i "error" build.log # 在構建日志中搜索錯誤信息
grep -i "warning" build.log # 在構建日志中搜索警告信息# 3. 查找相關源文件
find . -name "*.c" -exec grep -l "function_name" {} \; # 查找包含特定函數的源文件# 4. 檢查配置文件
grep -r "CONFIG_" . --include="*.config" # 搜索所有配置文件中的配置項# 5. 查看文件修改歷史
git log --follow -- filename.c # 查看特定文件的完整修改歷史
7. 高級技巧和最佳實踐
7.1 自動化腳本示例
#!/bin/bash
# build_and_test.shset -e # 遇到錯誤立即退出,確保腳本在出錯時停止執行echo "Starting build process..."# 設置環境
cd /home/share/primary/project_dev/camera_project # 切換到項目目錄
source build_envsetup.sh # 加載構建環境
source build/envsetup.sh # 加載Android構建環境
lunch 10 # 選擇構建目標# 清理構建
echo "Cleaning previous build..."
m clean_all # 清理之前的構建產物# 構建項目
echo "Building project..."
m all -j$(nproc) # 使用所有CPU核心進行構建# 查找構建產物
echo "Finding build artifacts..."
find . -name "*.bin" -o -name "*.img" # 查找生成的固件文件# 檢查構建狀態
if [ $? -eq 0 ]; then # 檢查構建是否成功echo "Build completed successfully!"
elseecho "Build failed!"exit 1 # 構建失敗時退出腳本
fi
7.2 常用別名設置
# 添加到 ~/.bashrc
alias ll='ls -la' # 顯示所有文件的詳細信息
alias la='ls -A' # 顯示所有文件(包括隱藏文件)
alias l='ls -CF' # 以列格式顯示文件# 項目相關別名
alias cdproj='cd /home/share/primary/project_dev/camera_project' # 快速切換到項目目錄
alias build='source build_envsetup.sh && source build/envsetup.sh && lunch 10' # 一鍵設置構建環境
alias clean='m clean_all' # 快速清理構建
alias makeall='m all -j$(nproc)' # 快速構建所有模塊
alias gs='git status' # 快速查看Git狀態
alias gl='git log --oneline' # 快速查看提交歷史
7.3 監控和日志分析
# 監控構建過程
watch -n 5 'ps aux | grep make' # 每5秒監控make進程狀態# 分析構建日志
grep -E "(error|warning|failed)" build.log | head -20 # 提取前20個錯誤或警告# 查看磁盤使用情況
du -sh out/ # 查看構建輸出目錄的大小
df -h # 查看磁盤空間使用情況# 監控系統資源
top -p $(pgrep make) # 監控make進程的系統資源使用
8. 故障排除指南
8.1 常見問題解決
# 構建失敗時的診斷步驟
echo "=== 系統信息 ==="
uname -a # 顯示系統內核信息
df -h # 顯示磁盤空間使用情況
free -h # 顯示內存使用情況echo "=== 構建環境 ==="
echo $ANDROID_BUILD_TOP # 顯示Android構建根目錄
echo $TARGET_PRODUCT # 顯示目標產品
echo $TARGET_BUILD_VARIANT # 顯示構建變體echo "=== 最近錯誤 ==="
tail -50 build.log # 顯示構建日志的最后50行echo "=== 磁盤空間 ==="
du -sh out/ # 顯示構建輸出目錄大小
8.2 性能優化
# 并行構建優化
export MAKEFLAGS="-j$(nproc)" # 設置make使用所有CPU核心# 緩存優化
export CCACHE_DIR=/path/to/ccache # 設置ccache緩存目錄
export USE_CCACHE=1 # 啟用ccache編譯緩存# 內存優化
export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g" # 設置Jack編譯服務器內存參數
9. 項目特定命令詳解
9.1 固件查找命令
find -name CameraDeviceFW.bin # 查找特定的固件文件
find . -name "*.bin" -type f # 查找所有二進制固件文件
find . -name "*FW*" -type f # 查找所有包含FW的固件文件
find . -path "*/firmware/*" -name "*.bin" # 在firmware目錄中查找固件
9.2 構建產物管理
# 查找所有構建產物
find out/ -name "*.img" -o -name "*.bin" -o -name "*.zip" # 查找所有鏡像和固件文件# 按時間排序查看最新構建產物
find out/ -name "*.img" -printf "%T@ %p\n" | sort -n | tail -10 # 顯示最近修改的10個鏡像文件# 統計構建產物大小
find out/ -name "*.img" -exec ls -lh {} \; # 顯示所有鏡像文件的大小
9.3 源代碼分析
# 查找特定功能的源代碼
grep -r "camera" src/ --include="*.c" --include="*.h" # 搜索攝像頭相關代碼# 查找函數定義
grep -r "^[[:space:]]*[a-zA-Z_][a-zA-Z0-9_]*[[:space:]]*(" src/ --include="*.c" # 查找所有函數定義# 查找宏定義
grep -r "^[[:space:]]*#define" src/ --include="*.h" # 查找所有宏定義
10. 開發環境配置
10.1 環境變量設置
# 設置項目環境變量
export PROJECT_ROOT=/home/share/primary/project_dev/camera_project # 設置項目根目錄
export PATH=$PROJECT_ROOT/tools:$PATH # 添加項目工具到PATH
export ANDROID_BUILD_TOP=$PROJECT_ROOT # 設置Android構建根目錄# 設置編譯環境
export ARCH=arm64 # 設置目標架構
export CROSS_COMPILE=aarch64-linux-gnu- # 設置交叉編譯工具鏈
export KERNEL_DIR=$PROJECT_ROOT/kernel # 設置內核源碼目錄
10.2 工具鏈配置
# 檢查工具鏈可用性
which aarch64-linux-gnu-gcc # 檢查交叉編譯工具鏈
which make # 檢查make工具
which git # 檢查git版本控制工具# 設置工具鏈路徑
export TOOLCHAIN_PATH=/opt/toolchain/aarch64-linux-gnu # 設置工具鏈路徑
export PATH=$TOOLCHAIN_PATH/bin:$PATH # 添加工具鏈到PATH
11. 版本控制和協作
11.1 分支管理策略
# 創建功能分支
git checkout -b feature/camera-module # 創建攝像頭模塊功能分支
git push -u origin feature/camera-module # 推送并設置上游分支# 合并代碼
git checkout develop # 切換到開發分支
git pull origin develop # 拉取最新代碼
git merge feature/camera-module # 合并功能分支
git push origin develop # 推送合并結果# 清理分支
git branch -d feature/camera-module # 刪除本地分支
git push origin --delete feature/camera-module # 刪除遠程分支
11.2 代碼審查流程
# 準備代碼審查
git diff develop...HEAD # 查看與develop分支的差異
git log --oneline develop..HEAD # 查看提交歷史# 創建補丁
git format-patch develop -o patches/ # 創建補丁文件
git send-email patches/ # 發送補丁郵件# 應用補丁
git am patches/*.patch # 應用補丁文件
12. 構建和部署
12.1 自動化構建腳本
#!/bin/bash
# auto_build.sh# 設置錯誤處理
set -e# 日志函數
log() {echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}# 構建函數
build_project() {log "Starting project build..."# 設置環境cd /home/share/primary/project_dev/camera_projectsource build_envsetup.shsource build/envsetup.shlunch 10# 清理構建log "Cleaning previous build..."m clean_all# 構建項目log "Building project..."m all -j$(nproc)# 查找構建產物log "Finding build artifacts..."find . -name "*.bin" -o -name "*.img"log "Build completed successfully!"
}# 執行構建
build_project
12.2 部署腳本
#!/bin/bash
# deploy.sh# 部署函數
deploy_firmware() {local firmware_path="$1"local target_device="$2"echo "Deploying firmware: $firmware_path to $target_device"# 檢查文件是否存在if [ ! -f "$firmware_path" ]; thenecho "Error: Firmware file not found: $firmware_path"exit 1fi# 復制固件到目標設備scp "$firmware_path" "$target_device:/tmp/"# 在目標設備上安裝固件ssh "$target_device" "sudo dd if=/tmp/$(basename $firmware_path) of=/dev/mmcblk0 bs=4M"echo "Firmware deployment completed!"
}# 使用示例
deploy_firmware "./out/target/product/device/firmware.bin" "user@device-ip"
13. 總結
這些命令和腳本構成了一個完整的嵌入式Linux項目開發工作流,涵蓋了從代碼管理到構建部署的各個環節。每個命令都有詳細的注釋說明其作用和用途,幫助開發者更好地理解和使用這些工具。
13.1 關鍵要點
- 版本控制:使用Git進行代碼管理,包括分支管理、代碼審查和協作
- 構建系統:使用Android構建系統進行項目編譯和打包
- 調試工具:使用grep、find等工具進行代碼搜索和問題排查
- 自動化:編寫腳本自動化構建和部署流程
- 環境管理:正確設置開發環境和工具鏈
13.2 最佳實踐
- 定期提交代碼,保持版本歷史的清晰
- 使用有意義的分支名和提交信息
- 在構建前清理環境,確保構建的一致性
- 使用并行編譯提高構建效率
- 保存構建日志用于問題排查
- 定期備份重要的構建產物