Probleme beim Festlegen von Umgebungsvariablen im Terminal in macOS High Sierra

Probleme beim Festlegen von Umgebungsvariablen im Terminal in macOS High Sierra

Ich habe ein Problem beim Festlegen einer Umgebungsvariable auf meinem MacBook Pro mit macOS High Sierra.

Im Terminal habe ich versucht, durch Ausführen eine Umgebungsvariable einzurichten export VARIABLE_URL=example.com. Anschließend habe ich versucht zu überprüfen, ob die Umgebungsvariable mit festgelegt wurde echo $VARIABLE_URL, aber das Ergebnis war leer.

Immer wenn ich jetzt das Terminal starte, erhalte ich diese Meldung:

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$

Ich habe versucht, die Variable zu meiner .bash_profileDatei hinzuzufügen, aber selbst das setzt die Variable nicht richtig. Jedes Mal, wenn ich es tue echo $VARIABLE_URL, wird leer zurückgegeben.

Ich habe in meinem andere Variablen festgelegt .bash_profile, aber dies ist die einzige Variable, die mein Computer nicht hinzufügen möchte.

Auch wenn ich ausführe printenv, werden alle Umgebungsvariablen außer angezeigt VARIABLE_URL.

Warum kann ich diese Umgebungsvariable nicht festlegen?

Bearbeiten: Hier ist der Inhalt meines .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: Folgendes wird angezeigt, wenn ich jetzt das Terminal öffne:

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$

... und hier ist, was bei printenvder Ausführung zurückgegeben wird:

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$

Letzte Bearbeitung: Es ist gelöst! Das Hinzufügen von einfachen Anführungszeichen zur URL hat den Trick getan:

export VARIABLE_URL='example.com'

Ich hätte ausdrücklich erklären sollen, dass die in dieser Frage angezeigte URL eine Platzhalter-URL ist und nicht die, die tatsächlich in meiner war .bash_profile. Die tatsächliche URL enthält tatsächlich mehrere &Zeichen. Es tut mir leid, dass ich das nicht von Anfang an erklärt habe. Ich denke, wenn ich das getan hätte, wäre das Problem früher gelöst worden. Trotzdem danke ich allen für ihre Hilfe und Vorschläge. Ich bin sehr froh, dass das jetzt alles geklärt ist.

Antwort1

Meine Hypothese:

Ihre tatsächliche URL verwendet die HTTP-GET-Methode wie folgt:

export VARIABLE_URL=example.com?foo=bar&appVersion=&osVersion=&deviceType=&deviceId=&fizz=buzz

Wobei ?und &Teil der URL-Syntax sind, die Shell sie jedoch anders interpretiert. &bewirkt, dass der vorhergehende Befehl im Hintergrund ausgeführt wird. Es ist auch ein Trennzeichen, sodass Sie anstelle eines Befehls mehrere haben. Der erste ist

export VARIABLE_URL=example.com?foo=bar

und dieser Wert wird als exportiert VARIABLE_URL.

Eine weitere Annahme: shopt -s nullglobist aktiv, sodass ?die GET-Syntax dazu führt, dass „unquoted“ $VARIABLE_URLin jedem Verzeichnis, in dem keine Dateien vorhanden sind, die dem Muster entsprechen, zu einer Nullzeichenfolge erweitert wird example.com?foo=bar.

Sie wollen

export VARIABLE_URL='example.com?foo=bar&appVersion=&osVersion=&deviceType=&deviceId=&fizz=buzz'

wobei einfache Anführungszeichen die Shell veranlassen, ?und &-Zeichen wörtlich zu behandeln (doppelte Anführungszeichen würden in diesem speziellen Beispiel auch funktionieren; aber ich kenne Ihre tatsächliche URL nicht, einfache Anführungszeichen sind im Allgemeinen sicherer). Außerdem

echo "$VARIABLE_URL"

wobei doppelte Anführungszeichen das Globbing verhindern (das sonst aufgrund von ?im Variableninhalt auftreten würde), unabhängig von nullglobund den Dateien im aktuellen Verzeichnis.

Antwort2

Aufgrund der Ausgabe, die Sie von .bash_profile erhalten, gehe ich davon aus, dass sie etwa Folgendes enthält:

export VARIABLE_URL=example.com & appVersion= & osVersion= & deviceType= & deviceId= & somethingelse=

Die Zeichen " " sind hier nicht erwünscht &, da sie die Bedeutung auf irrelevante und nutzlose Weise verändern. Sie können mehrere Umgebungsvariablen in einem einzigen exportBefehl definieren, indem Sie sie durch Leerzeichen trennen:

export VARIABLE_URL=example.com appVersion= osVersion= deviceType= deviceId= somethingelse=

Oder es ist vielleicht klarer, einfach exportfür jede Variable einen separaten Befehl zu verwenden:

export VARIABLE_URL=example.com
export appVersion=
export osVersion=
export deviceType=
export deviceId=
export somethingelse=

Übrigens, der Grund, warum " &" Probleme verursacht, ist, dass es ein Trennzeichen zwischen Befehlen ist und den Befehl vor ihm im Hintergrund ausführen lässt. Daher wird jede Zuweisung als völlig separater Befehl behandelt (nur der erste ist ein export, der Rest sind nicht exportierte Shell-Variablen) und alle außer dem letzten werden im Hintergrund ausgeführt .in getrennten Prozessen, und die Definitionen sind lokal für diese Prozesse (und verschwinden, wenn diese Prozesse beendet sind). Das ist es, was all diese „Done“-Zeilen bedeuten – sie zeigen an, dass diese Hintergrundprozesse beendet sind.

verwandte Informationen