在修改以冒號分隔的環境變量時,例如 PYTHONPATH、PATH、CPATH、MANPATH、LD_LIBRARY_PATH、PKG_CONFIG_PATH 等......其中一些變量對尾隨冒號具有特殊意義,而其他變量則沒有。
對於 PYTHONPATH 和 PATH,如果變量之前未設置,可以以不會意外引入尾隨(或前導)冒號的方式預先(或附加)新目錄:
export PYTHONPATH="/some/path${PYTHONPATH+":"}${PYTHONPATH-}"
解釋:
${PYTHONPATH+":"}
擴展為 :
如果設置了 PYTHONPATH,無論 PYTHONPATH 是否為空。
${PYTHONPATH-}
如果設置了將擴展到 PYTHONPATH 的內容,但如果未設置 PYTHONPATH,則 ${PYTHONPATH-}
擴展為空 --- 就像通常的 ${PYTHONPATH}
.
${PYTHONPATH-}
與 ${PYTHONPATH-""}
相同意思是在未設置 PYTHONPATH 時替換 ""(無)。
推薦理由${PYTHONPATH-}
在 ${PYTHONPATH}
這是${PYTHONPATH-}
當 PYTHONPATH 未設置且您的腳本已執行時,不會產生錯誤 set -u
引發未設置變量的錯誤。
例如:
export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/lib/py4j-0.10.7-src.zip:$PYTHONPATH 會引入當前工作目錄
[root@node02 ~]# python3 #當前目錄為/root
Python 3.7.8 (default, Apr 27 2021, 13:33:25)
[GCC 7.3.1 20180303 (Red Hat 7.3.1-5)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/usr/local/spark-2.4.3-bin-hadoop2.7/python', '/usr/local/spark-2.4.3-bin-hadoop2.7/python/lib/py4j-0.10.7-src.zip', '/root', '/usr/local/python3/lib/python37.zip', '/usr/local/python3/lib/python3.7', '/usr/local/python3/lib/python3.7/lib-dynload', '/usr/local/python3/lib/python3.7/site-packages']
export PYTHONPATH="/tmp${PYTHONPATH+":"}${PYTHONPATH-}" 不會引入當前工作目錄
[root@node02 ~]# python3 #當前目錄為 /root
Python 3.7.8 (default, Apr 27 2021, 13:33:25)
[GCC 7.3.1 20180303 (Red Hat 7.3.1-5)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/tmp', '/usr/local/python3/lib/python37.zip', '/usr/local/python3/lib/python3.7', '/usr/local/python3/lib/python3.7/lib-dynload', '/usr/local/python3/lib/python3.7/site-packages']