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
、空白が返されます。
他の変数も設定しました.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
編集2: ターミナルを開いたときに表示される内容は次のとおりです。
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 であり、実際に私の にある URL ではないことを明確に説明すべきでした.bash_profile
。実際の URL には複数の&
文字が含まれています。最初からそのことを説明していなかったことをお詫びします。そうしていれば、問題はもっと早く解決できたと思います。いずれにせよ、皆さんの助けと提案に感謝します。これですべて解決できてとてもうれしいです。
答え1
私の仮説:
実際の URL では、次のように HTTP GET メソッドが使用されます。
export VARIABLE_URL=example.com?foo=bar&appVersion=&osVersion=&deviceType=&deviceId=&fizz=buzz
と は?
URL&
構文の一部ですが、シェルはそれらを異なる方法で解釈します。 は&
、前のコマンドをバックグラウンドで実行します。 これは区切り文字でもあるため、1つのコマンドではなく複数のコマンドになります。最初のコマンドは
export VARIABLE_URL=example.com?foo=bar
この値は としてエクスポートされますVARIABLE_URL
。
もう 1 つの前提:shopt -s nullglob
がアクティブであるため、?
GET 構文の により$VARIABLE_URL
、パターンに一致するファイルがないディレクトリでは、引用符なしが null 文字列に展開されますexample.com?foo=bar
。
あなたが望む
export VARIABLE_URL='example.com?foo=bar&appVersion=&osVersion=&deviceType=&deviceId=&fizz=buzz'
ここで、シングルクォートは、シェルが文字?
を&
文字通りに扱うようにします(この特定の例では、ダブルクォートも機能しますが、実際のURLはわかりません。一般的にシングルクォートの方が安全です)。さらに、
echo "$VARIABLE_URL"
ここで、二重引用符は、現在のディレクトリ内の および ファイル?
に関係なく、変数の内容が原因で発生するグロビングを防止します。nullglob
答え2
.bash_profile から取得した出力から、次のような内容が含まれていると推測します。
export VARIABLE_URL=example.com & appVersion= & osVersion= & deviceType= & deviceId= & somethingelse=
そこに「 」文字は不要です。意味が無関係で役に立たない方法で変更されます。スペースで区切ることで、&
1 つのコマンドで複数の環境変数を定義できます。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
、残りはエクスポートされていないシェル変数です)、最後以外はすべてバックグラウンドで実行されます。別々のプロセスで、定義はそれらのプロセスに対してローカルです (そしてそれらのプロセスが終了すると消えます)。それが、すべての「Done」行です。つまり、それらのバックグラウンド プロセスが終了したことを示します。