![macOS High Sierra의 터미널에서 환경 변수를 설정하는 데 문제가 있습니다.](https://rvso.com/image/1586929/macOS%20High%20Sierra%EC%9D%98%20%ED%84%B0%EB%AF%B8%EB%84%90%EC%97%90%EC%84%9C%20%ED%99%98%EA%B2%BD%20%EB%B3%80%EC%88%98%EB%A5%BC%20%EC%84%A4%EC%A0%95%ED%95%98%EB%8A%94%20%EB%8D%B0%20%EB%AC%B8%EC%A0%9C%EA%B0%80%20%EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4..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
공백이 반환됩니다.
내 에 다른 변수를 설정했지만 .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은 실제로 내 .bash_profile
. 실제 URL에는 실제로 여러 &
문자가 포함되어 있습니다. 처음부터 설명을 드리지 못해 죄송합니다. 그렇게 했다면 문제가 더 빨리 해결되었을 거라 생각합니다. 그럼에도 불구하고, 도움과 제안을 해주신 모든 분들께 감사드리며, 이제 모든 문제가 해결되어 매우 기쁩니다.
답변1
내 가설:
실제 URL은 다음과 같이 HTTP GET 메소드를 사용합니다.
export VARIABLE_URL=example.com?foo=bar&appVersion=&osVersion=&deviceType=&deviceId=&fizz=buzz
와 는 ?
URL &
구문의 일부이지만 쉘은 이를 다르게 해석합니다. &
이전 명령이 백그라운드에서 실행되도록 합니다. 또한 구분 기호이므로 하나의 명령 대신 여러 개가 있습니다. 첫 번째는
export VARIABLE_URL=example.com?foo=bar
이 값은 VARIABLE_URL
.
또 다른 가정은 shopt -s nullglob
다음과 같습니다 . ?
GET 구문을 사용하면 $VARIABLE_URL
패턴과 일치하는 파일이 없는 모든 디렉터리에서 따옴표가 없는 널 문자열로 확장됩니다 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=
거기에 " " 문자가 있는 것을 원하지 않을 것입니다 &
. 문자는 부적절하고 쓸모없는 방식으로 의미를 변경합니다. 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
나머지는 내보내지 않은 셸 변수임) 마지막 명령을 제외한 모든 명령은 백그라운드에서 실행됩니다.별도의 프로세스에서, 정의는 해당 프로세스에 대해 로컬입니다(해당 프로세스가 완료되면 사라집니다). 이것이 바로 모든 "완료" 줄입니다. 즉, 백그라운드 프로세스가 완료되었음을 나타냅니다.