![在 macOS High Sierra 的終端機中設定環境變數時出現問題](https://rvso.com/image/1586929/%E5%9C%A8%20macOS%20High%20Sierra%20%E7%9A%84%E7%B5%82%E7%AB%AF%E6%A9%9F%E4%B8%AD%E8%A8%AD%E5%AE%9A%E7%92%B0%E5%A2%83%E8%AE%8A%E6%95%B8%E6%99%82%E5%87%BA%E7%8F%BE%E5%95%8F%E9%A1%8C.png)
我在執行 macOS High Sierra 的 MacBook Pro 上設定環境變數時遇到問題。
在終端機中,我嘗試透過執行來設定環境變數export VARIABLE_URL=example.com
。然後我嘗試檢查環境變數是否已設置echo $VARIABLE_URL
,但它返回了空白結果。
現在,每當我啟動終端時,我都會收到以下訊息:
Last login: Tue Apr 2 15:08:56 on ttys000
[1] Done export VARIABLE_URL=example.com
[2] Done appVersion=
[3] Done osVersion=
[4] Done deviceType=
[5]+ Done deviceId=
My-MacBook-Pro:~ me$
我嘗試將變數添加到我的.bash_profile
文件中,但即使這樣也無法正確設定變數。每次我這樣做echo $VARIABLE_URL
,它都會返回空白。
我在 my 中設定了其他變量.bash_profile
,但這是我的計算機拒絕添加的唯一變量。
即使當我執行時printenv
,所有環境變數都會顯示,除了VARIABLE_URL
.
為什麼我不能設定這個環境變數?
編輯:這是我的內容.bash_profile
:
export BACKEND=example
export VARIABLE_URL=example.com
export HOST=localhost
export BASEURL=example
export SECRET=example
export USERNAME=example
export ACCESS_KEY=example
Edit2:這是我現在打開終端機時顯示的內容:
Last login: Wed Apr 3 13:06:20 on ttys000
+ export BACKEND=example
+ BACKEND=example
+ export 'VARIABLE_URL=example.com'
+ VARIABLE_URL='example.com'
+ appVersion=
+ osVersion=
+ deviceType=
+ clientType=
+ export HOST=localhost
+ HOST=localhost
+ export BASEURL=example
+ BASEURL=example
+ export SECRET=example
+ SECRET=example
+ export USERNAME=example
+ USERNAME=example
+ export ACCESS_KEY=example
+ ACCESS_KEY=example
+ deviceId=
My-MacBook-Pro:~ me$
....這是printenv
執行時回傳的內容:
TERM_PROGRAM=Apple_Terminal
USERNAME=example
SHELL=/bin/bash
TERM=xterm-256color
TMPDIR=/var/folders/g6/q9bwlzxn36jfb2j53c5t_t080000gn/T/
Apple_PubSub_Socket_Render=/private/tmp/com.apple.launchd.GZQ9CxlO7F/Render
TERM_PROGRAM_VERSION=404.1
TERM_SESSION_ID=45B1D3A5-719E-4C24-9026-C52A374B3809
USER=me
SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.nXK7LMtVZx/Listeners
BACKEND=example
SECRET=example
HOST=localhost
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/Wireshark.app/Contents/MacOS
PWD=/Users/me
LANG=en_US.UTF-8
XPC_FLAGS=0x0
XPC_SERVICE_NAME=0
SHLVL=1
HOME=/Users/me
LOGNAME=me
ACCESS_KEY=example
BASEURL=example
_=/usr/bin/printenv
My-MacBook-Pro:~ me$
最終編輯:已經解決了!在 URL 中加入單引號就可以了:
export VARIABLE_URL='example.com'
我應該明確解釋一下,這個問題中顯示的 URL 是一個佔位符 URL,而不是我的.bash_profile
.實際的 URL 實際上包含多個&
字元。我很抱歉沒有從一開始就解釋這一點。我覺得如果我這樣做的話,問題就會早點解決。無論如何,感謝大家的幫助和建議,我很高興現在這一切都得到了解決。
答案1
我的假設:
您的實際 URL 使用 HTTP GET 方法,如下所示:
export VARIABLE_URL=example.com?foo=bar&appVersion=&osVersion=&deviceType=&deviceId=&fizz=buzz
其中?
和&
是 URL 語法的一部分,但 shell 對它們的解釋不同。&
使前面的命令在後台運行。它也是一個分隔符,因此您可以使用多個命令,而不是一個命令。第一個是
export VARIABLE_URL=example.com?foo=bar
並且該值導出為VARIABLE_URL
.
另一個假設:shopt -s nullglob
是活動的,因此?
GET 語法中的 會導致 unquoted$VARIABLE_URL
在任何沒有與模式相符的檔案的目錄中擴展為空字串example.com?foo=bar
。
你要
export VARIABLE_URL='example.com?foo=bar&appVersion=&osVersion=&deviceType=&deviceId=&fizz=buzz'
其中單引號使 shell 按字面意思對待?
和&
字元(雙引號也適用於這個特定的範例;但我不知道您的實際 URL,單引號通常更安全)。另外
echo "$VARIABLE_URL"
其中雙引號可以防止通配符(否則會因為?
變數內容而發生),無論nullglob
目前目錄中的檔案為何。
答案2
從您從 .bash_profile 獲得的輸出中,我猜您其中有類似的內容:
export VARIABLE_URL=example.com & appVersion= & osVersion= & deviceType= & deviceId= & somethingelse=
您不希望&
出現“ ”字符,它們會以不相關且無用的方式改變含義。您可以在單一命令中定義一堆環境變量,export
並用空格分隔它們:
export VARIABLE_URL=example.com appVersion= osVersion= deviceType= deviceId= somethingelse=
export
或者對每個變數使用單獨的命令可能會更清楚:
export VARIABLE_URL=example.com
export appVersion=
export osVersion=
export deviceType=
export deviceId=
export somethingelse=
順便說一句,「 」引起麻煩的原因&
是它是命令之間的分隔符,並使命令之前的命令在後台運行。因此,每個分配都被視為一個完全獨立的命令(只有第一個是export
,其餘的是未導出的 shell 變數),並且除了最後一個之外的所有命令都在後台運行在單獨的進程中,並且定義對於這些進程來說是本地的(並在這些進程完成時消失)。這就是所有那些「完成」行的含義——它們表明這些後台進程已經完成。