1、由macOS配置環境變量引申的問題
通常在macOS上配置環境變量,比如配置maven的環境變量,是這樣的操作的。在用戶的目錄下面,找到或者新建 .bash_profile 文件,然後按照如下配置:
export MAVEN_HOME=/Users/name/downloads/apache-maven-3.8.1 export PATH=$PATH:$MAVEN_HOME/bin export PATH=$PATH:/usr/local/mysql/bin export PATH=$PATH:/opt/homebrew/bin
使用source命令重新載入一下,
source .bash_profile
這樣這終端輸入 mvn 命令,即可執行對應的maven命令了。過了一段時間發現,每次啓動終端時候,都需要重載一下 .bash_profile 文件才能使環境變量生效。解決方法:找到或者新建文件 .zshrc ,添加下面一段:
source ~/.bash_profile
每次終端啓動時,就會自動重載。
實際上遇到這類問題,是因爲對操作系統和Bash的不熟悉,零零碎碎的“解決方法”,只能短暫的解決問題。這裏總結下macOS終端上常用的Bash命令,旨在熟悉常見的cv腳本的配置原理。
2、Bash 簡介
Bash是Linux 和 Unix系統的一種命令行環境(cli),解釋輸入的命令,具有完整的變量賦值、條件判斷、循環操作等語法。命令行環境有很多,使用macOS查看支持的命令行環境:
cat /ect/shells
# List of acceptable shells for chpass(1). # Ftpd will not allow users to connect who are not using # one of these shells. /bin/bash /bin/csh /bin/dash /bin/ksh /bin/sh /bin/tcsh /bin/zsh
其中Bash是大多數Linux發行版的默認的命令行環境。在macOS中,從Catalina 版開始,Mac 將使用 zsh 作爲默認命令行環境。zsh 與 Bourne Shell (sh) 高度兼容,並且與 bash 基本兼容,但存在一些差別。具體參見。
查看當前的環境使用命令:
echo $SHELL
/bin/zsh
3、常用的Bash命令
1、輸入與輸出
echo命令用於打印一行或一段文本。
bash-3.2$ echo hi hi
read命令用於獲取用戶的輸入內容。
bash-3.2$ read i && echo $i hi //輸入內容 hi //輸出內容 bash-3.2$
2、語句操作符
分號 ; 是命令的結束符,同行表示緊接着執行下一條命令:(無論第一條命令是否成功,下一條都會執行與之不同的是 && ||)
read i;echo $i
與&& ,與編程彙總的布爾操作符類似,第一條命令執行成功後,執行第二條命令;
read i && echo $i
或|| ,表示第一條命令執行失敗後,執行第二條命令;
read i || echo $i
3、區分命令類型
有些命令是系統自帶的,有些命令是在外部程序添加到環境變量後運行的,使用type命令區分內置命令和外部程序。
bash-3.2$ type echo echo is a shell builtin
bash-3.2$ type mysql mysql is /usr/local/mysql/bin/mysql
4、Bash變量
變量分爲環境變量與系統變量。使用env命令顯示環境變量,
env
創建變量直接申明變量名即可,注意賦值操作不可加空格,
i=1 echo $i //1
讀取變量使用 $+變量名即可,如上所示。
export 命令 用於向不同的終端之間傳遞變量。在 zsh 下定義變量,使用export命令在bash也能獲取到。
export MAVEN_HOME=/Users/name/downloads/apache-maven-3.8.1
可以看到環境變量腳本中定義的 MAVEN_HONE 變量使用了export。
5、bash歷史記錄
bash會記錄命令的歷史記錄,在macOS系統中保存在隱藏的文件 .bash_history文件中。並且對應的命令行環境均有對應記錄文件。
history 命令同樣顯示使用過的命令記錄,
history . . . 98 echo $i 99 history
6、source 命令
source命令用於重新加載一個配置文件,
source ~/.bash_profile
表示重新加載.bash_profile中配置的環境變量。
4、macOS中環境變量的生效順序
使用交互式命令行環境時,每次啓動一次命令行環境,都會開啓一次Session對話,按照登錄的狀態可分爲登錄的Session和非登錄的Session。
在Linux中登錄的session會初始化系統環境,初始化的順序依次爲:(注意用戶級的配置腳本,第一個加載成功後,不再加載後續腳本文件。)
- 系統級:/etc/profile 、/etc/paths ;
- 用戶級:~/.bash_profile 、~/.bash_login 、~/.profile 、~/.bashrc 。
Linux中非登錄的Session,不會進行環境的初始化。初始化的腳本加載順序爲:
- /etc/bash.bashrc:對全體用戶有效。
- ~/.bashrc:僅對當前用戶有效。
在macOS中,我們打開的終端均爲非登錄的Session。因此每次啓動終端,都會加載.bashrc 或 .zshrc文件, 這也是上述爲何將重載命令source ~/.bash_profile 寫入 .zshrc 的原因。
參考鏈接:
1、https://support.apple.com/zh-cn/HT208050
2、https://wangdoc.com/bash/index.html