iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 4
0
自我挑戰組

30 天的 ShellScript 教室解決開發者的困擾系列 第 4

[鐵人賽第04天] 各種環境變數介紹

昨天的文如果注意看,應該會發現有個範例修改了一個內建的變數叫做 LANGapt-get 變成用英文跑。其實在 Shell 裡面還有非常多這種預設就會存在的環境變數,以下就介紹幾個可能會用到、或是曾經雷過我的環境變數吧。

語言相關

在 Unix Like 系統中(除了 Mac 以外),可以用 locale 這個指令叫出來,結果大概會長這樣:
locale

其中我們比較會用到的大概是 LANG 這個項目,前面的 zh_TW 是語系沒啥問題,後面的 UTF-8 則表示目前系統要用哪種編碼方式。

debug 程式的時候,因為要開 Server 我習慣用 tmux 把 Server 掛起來,這無論是遠端桌面或是 ssh 進去都可以看到 server 訊息。可是上個月 ssh 進去 Mac 卻發現一個討厭的現象,就是所有的中文都變成 _ 了。

正想說「 Mac 在搞什麼」的時候,打了個 locale 指令:我的天啊 Mac 裡的 LANG 預設是空的沒東西,然後 tmux 從 LANG 裡面抓編碼方式,抓不到編碼方式,所以就把所有的中文字替換了。

怎解?用 ssh 進去 Mac 後, export LANG=zh_TW.UTF-8 ,再打 tmux a , It Works!

如果你用 Ubuntu ,可以透過語言中心更改語言;如果你的 Linux 發行版沒有自己的語言管理中心而且採用 systemd ,那麼可以透過 localectl 指令修改它。

Shell 高度相關

剩下的環境變數,幾乎可以用 env 這個指令列表出來,介紹幾個容易用到的環境變數,以及他怎麼影響我們的 Shell 吧。

PATH

你可想過為什麼我們打指令的時候,不用打 /usr/bin/python ,可以直接打 python 呢?這就是 PATH 的功能。 PATH 裡面有紀錄很多個資料夾( Windows 用 ; 分隔, Unix Like 用 : 分隔),當你打一個指令時, Shell 會先去 PATH 裡面的資料夾找有沒有這個像是 lsgit 或是 adb 之類的檔案,有的話就執行它,沒有記跟你說 command not found

我自己寫很多 Script 讓我偷懶,所以我習慣會這樣做: export PATH=$PATH:$HOME/bin ,然後把在家目錄底下建立 bin 資料夾放我的 Script。

HOME

紀錄現在這個使用者的家目錄在哪裡,就這樣。

SHELL

記錄你現在用的是哪個 Shell ,如果你忘了可以來這裡查。

TERM

記錄你現在的 Terminal 支援那些樣式,像是 xterm 可以顯示 256 色之類的。

PWD

記錄你現在的工作目錄,不過 export PWD=/path 是無法切換路徑的。

EDITOR

記錄你慣用的編輯器,像是 git 在 commit 的時候,跳出來的編輯器就是由他決定(沒有的話, git 會抓 nano 來用)。

SSH 相關

如果你透過 ssh 連進主機,還會以以下幾個變數:

  • SSH_CLIENT
  • SSH_TTY
  • SSH_CONNECTION (不一定會有)

特殊參數

以下的參數比較特別,但是總是會用到、或是被雷到。

Login / non-Login Shell

先說說什麼是 Login Shell ,什麼是 non-Login Shell 吧。簡單講就是「開啟」的方式不一樣,有時候你是打完帳號密碼才進去 Shell ,無論透過 ssh 還是做到電腦前,這種就是 Login Shell;但有時候我們已經在圖形介面登入了,我們沒有打帳號密碼就開啟終端機,這種就是 non-Login Shell 。

你說 su 指令嗎?只打 su 是 Login Shell,打 su - 就是 non-Login Shell,你可以透過 echo $0 看看前面有沒有 - 號得知這是哪一種 Shell 。

這會怎麼影響呢?看到上面很多環境變數想改吧,但是每次關掉要 export 很麻煩。那麼要放在哪裡呢? ~/.profile 還是 ~/.bashrc~/.zshrc

事情是這樣的,如果你是 Login Shell , Shell 會先去讀取 ~/.profile ,再去讀取 ~/.bash_profile 還有 ~/.bashrc ;但如果是 non-Login Shell ,因為已經有環境了,所以系統只會讀取 ~/.bashrc 喔。

所以如果你習慣用圖形介面開終端機,你希望改了馬上有效,那你應該把 export PATH=$PATH:$HOME/bin 放在 ~/.bashrc 或是 ~/.zshrc ,因為放在 ~/.profile ,你得整個圖形介面登出再登入,才能看到效果。

或是你可以偷吃步: source ~/.profile~/.profile 的變數直接載入到現在的 Shell ,直接 ./.profile 除了可能權限不對, ~/.profile 裡面的變數也不會匯出喔。

還有一個地方有影響, /etc/motd 只會在 Login Shell 顯示, non-Login Shell 並不會顯示,這個在寫 ASCII Art Collection 的時候找超久!!

Interactive / non-Interactive Shell

這個更神奇,有時候 docker run 的時候, apt-get 沒問我要不要裝,有時候又問我要不要裝,然後發現只是差一個 -i 參數,究竟是怎樣?

Docker 這個 -i 參數其實就是告訴 Container 這個 Shell 是不是 Interactive Shell。除了 Docker 以外, Linux 的 corntab 執行指令時,也會是 non-Interactive Shell。

可以透過 echo $- 看裡面有沒有 i 得知這個 Shell 是不是 Interactive Shell。如果你要寫一隻 Script 同時可以要讓 corntab 自動執行,偶爾你也會去手動跑他,那麼這個環境變數就很重要啦。

結語

以上寫介紹了一大堆環境變數,你也知道該怎麼改了,明天來看看環境變數怎麼雷人、以及怎麼找出地雷修復它吧。


我是誰?
我是 dd-han ,可以叫我呆翰,是國立臺中科技大學的延畢生 與 創科資訊的時習生。


上一篇
[鐵人賽第03天] 變數與 echo
下一篇
[鐵人賽第05天] 實戰:我的 adb 勒!
系列文
30 天的 ShellScript 教室解決開發者的困擾23
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言