首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

深入理解 Linux Bash 腳本中的 hide 變量與 Makefile 執行邏輯

     編輯:程式設計綜合問答

在閱讀 Linux 系統構建腳本時,經常會遇到類似 hide := @ 這樣的定義,後續命令前會加上 $(hide)。這其實是 Makefile 中常見的靜默執行技巧。本文將詳細解析這段腳本的含義、執行流程以及 @ 符號的作用。

腳本代碼分析

hide := @ 
SHOWTIMECMD := date "+%Y/%m/%d H:%M:%S"
ifeq ($(TRUSTZONE_PARTITION),yes)
  ifneq ($(wildcard $(TRUST_TEE_WD)/build.sh),)
    $(hide) echo $(SHOWTIME) $@ ing ...
    $(hide) echo -e \\t\\t\\t\\b\\b\\b\\bLOG: $(LOG_DIR)$(PROJECT_NAME)_$@.log
    $(hide) rm -f $(LOG_DIR)$(PROJECT_NAME)_$@.log $(LOG_DIR)$(PROJECT_NAME)_$@.log_err
    $(hide) $(SHELL) $(TZ_BUILD_SCRIPT) $(PROJECT_NAME) $(DEAL_STDOUT)
    $(hide) cp -f $(TRUST_TEE_IMAGES) $(LOG_DIR)/$(PROJECT_NAME)/
  else
    $(hide) echo Not find $(TRUST_TEE_WD)/build.sh, skip $@.
  endif
else
  $(hide) echo Not support $@.
endif

核心概念解析

1. hide 變量與 @ 符號的作用

hide := @ 定義了一個變量,其值為 @。在 Makefile 中,命令行前加上 @ 可以抑制該命令本身的回顯。默認情況下,Make 會在執行命令前將命令打印到終端;加上 @ 後,只會顯示命令的輸出結果,不會顯示命令本身。

例如:

  • echo hello → 輸出:echo hello 然後換行 hello
  • @echo hello → 輸出:hello

這在構建過程中非常有用,避免終端被大量命令行刷屏,只保留關鍵日誌信息。

2. 條件判斷邏輯

腳本使用了 Makefile 的條件語法:

  • ifeq ($(TRUSTZONE_PARTITION),yes):判斷是否啟用 TrustZone 分區
  • ifneq ($(wildcard $(TRUST_TEE_WD)/build.sh),):使用 wildcard 函數檢查構建腳本是否存在

只有當 TrustZone 分區啟用 且 存在對應的 build.sh 時,才會執行後續的構建流程:打印時間戳、日誌路徑、清理舊日誌、調用構建腳本、複製生成的鏡像文件。

3. 變量引用與轉義字符

  • $(SHOWTIME):引用時間命令變量(注意原代碼中定義為 SHOWTIMECMD 但引用為 SHOWTIME,可能是筆誤)
  • $@:Makefile 自動變量,表示當前目標名稱
  • \\t\\t\\t\\b\\b\\b\\b:轉義序列,用於格式化輸出對齊(製表符 + 退格符)

實際應用場景

這類腳本常見於 Android 系統構建、嵌入式 Linux 構建系統(如 Buildroot、Yocto)或廠商定製的構建流程中。TrustZone 是 ARM 架構的安全擴展,TEE (Trusted Execution Environment) 相關組件的編譯往往需要獨立的構建流程,因此在主構建系統中通過條件判斷來調用子構建腳本。

常見問題與注意點

  1. 變量名一致性:代碼中定義 SHOWTIMECMD 但使用 SHOWTIME,實際使用時需確認變量名是否正確
  2. 路徑變量定義:TRUST_TEE_WD、LOG_DIR、PROJECT_NAME 等需在上層 Makefile 或環境變量中定義
  3. 錯誤處理:若 build.sh 不存在或構建失敗,腳本僅打印提示,不會中斷主構建流程(除非顯式調用 exit 或返回非零值)

總結

這段腳本展示了 Makefile 中靜默執行(@)、條件構建(ifeq/ifneq)、文件存在性檢查(wildcard)以及子腳本調用的典型模式。理解 hide := @ 這一技巧,有助於編寫更乾淨、可讀性更強的構建腳本,也能在閱讀現有項目的構建系統時快速定位關鍵邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved