什麼是環境變數

行程所持有的「名稱=值」組合的集合,用來從外部設定程式的行為。啟動行程時,父行程環境變數的副本會由子行程繼承。在 shell 中,只有像 export X=1 這樣 export 的變數才會成為環境變數並傳給子行程,只做了指定的變數只在該 shell 中使用。除了搜尋指令目錄的 PATH、家目錄的 HOME、搜尋共用函式庫的 LD_LIBRARY_PATH,也用於指定 EDA 工具的授權伺服器等。可用 env 或 printenv 列出。

日文名稱: 環境変数

「環境變數」出現在4領域的8道練習題中(雲端與容器基礎, Linux與命令列基礎, 連結器與載入器與執行檔格式等)。

這個名詞所屬的領域: Linux與命令列基礎

練習環境變數的題目

啟動程式時(Linux的execve等),作業系統的載入器所進行的事項,下列何者正確?

  1. A讀取原始碼,當場編譯後再執行
  2. B依照執行檔的程式標頭,將各部分配置到記憶體,並在堆疊上準備引數等,再從入口位址開始執行
  3. C先將執行檔的所有符號名稱顯示在畫面上再執行
查看答案與解析

正確答案:B. 依照執行檔的程式標頭,將各部分配置到記憶體,並在堆疊上準備引數等,再從入口位址開始執行

載入器會讀取執行檔的標頭,將程式標頭所記載的各部分(區段,segment)附上讀取、寫入、執行的權限,對應到虛擬位址空間。接著準備BSS用的0值區域與堆疊,並將命令列引數與環境變數推入堆疊。若是動態連結,就從動態連結器開始,否則從執行檔的入口位址開始執行。

目前目錄中有附加執行權限的腳本 run.sh,輸入「run.sh」執行時出現「command not found」,輸入「./run.sh」則能執行。理由是下列何者?

  1. Arun.sh 沒有執行權限,只有在前面加上 ./ 時才能在沒有權限的情況下執行
  2. B不含斜線的指令名稱只會在環境變數 PATH 的目錄中尋找,而目前目錄一般不包含在其中
  3. Crun.sh 第1行的 #!/bin/bash(shebang)只有在前面加上 ./ 執行時才會被讀取
查看答案與解析

正確答案:B. 不含斜線的指令名稱只會在環境變數 PATH 的目錄中尋找,而目前目錄一般不包含在其中

shell 收到不含斜線的指令名稱時,會依序在環境變數 PATH 中以冒號分隔列出的目錄(/usr/local/bin:/usr/bin 等)中尋找並執行。為了避免誤執行放在其他地方的同名惡意程式,一般不會把目前目錄放進 PATH。像 ./run.sh 這樣寫出含有斜線的路徑時,就不會搜尋 PATH,而是直接執行該檔案。第1行的 #!/bin/bash(shebang)不論以哪種方式啟動,都會指定執行該腳本的直譯器。

解析中的「環境變數」

出現「環境變數」的題目(8題)

  1. 如上所示,不把資料庫的連線目標寫進映像檔,而是在啟動容器時以環境變數傳入。這個設計的主要優點,下列何者最適當?
  2. 啟動程式時(Linux的execve等),作業系統的載入器所進行的事項,下列何者正確?
  3. 目前目錄中有附加執行權限的腳本 run.sh,輸入「run.sh」執行時出現「command not found」,輸入「./run.sh」則能執行。理由是下列何者?
  4. 依序執行上面的指令時,兩個 bash -c 的輸出組合是下列何者?
  5. 在 cron 中登錄了「30 2 * * 1 /home/alice/backup.sh」。backup.sh 執行的時間是下列何者?
  6. CGI在Web伺服器每次收到請求時,都以新的行程啟動程式,處理結束後行程就終止。FastCGI或應用程式伺服器的方式,比CGI更能有效率地處理大量請求的主要理由為下列何者?
  7. 把資料庫的密碼存放在 Kubernetes 的 Secret 中。關於 Secret 的說明,下列何者正確?
  8. 以 CI/CD 管線建置的容器映像檔,在預備(staging)環境中測試並合格了。把這個映像檔發布到正式環境的方法,下列何者最適當?

相關名詞

Kubernetes Shell(命令解譯器) 載入器(Loader) 堆疊 引數 動態連結(Dynamic linking) 動態連結器(Dynamic linker) 變數 cron Pod

前往名詞解釋列表