Replies: 2 comments
-
@KenWR 확인해주시고 의문점이 없으시면 Close 해주시면 될 것 같습니다! |
Beta Was this translation helpful? Give feedback.
0 replies
-
@yhames 너무 정리 잘해주셔서 쉽게 이해할 수 있었습니다 감사합니다! 오타만 수정해주시면 감사하겠습니다!
|
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
쉘 변수와 환경 변수
minishell 과제에서 built-in 명령어들은 모두 환경변수와 관련된 명령어 입니다.
built-in 명령어를 구현하다가
env
명령어에 대해 이해가 되지 않아서 쉘 변수와 환경변수에 대해 정리를 해야겠다는 생각이 들었습니다.env
명령어는 옵션을 제외하고 다음과 같이 2가지 방식으로 사용할 수 있습니다.TERM_SESSION_ID=w0t0p0:4A2AC993-C7C8-4745-9387-F181921C1CC8 SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.bGePyIUzEC/Listeners LC_TERMINAL_VERSION=3.4.23 # ...
TERM_SESSION_ID=w0t0p0:4A2AC993-C7C8-4745-9387-F181921C1CC8 SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.bGePyIUzEC/Listeners # ... TEST=test
즉,
env
명령어를 사용해서 출력되는 변수들의 목록은 환경변수 뿐만 아니라env
명령어의 매개변수로 전달한 쉘 변수를 포함합니다.쉘 변수
쉘 변수란 해당 쉘 스크립트 혹은 쉘 세션에서 임시로 사용하는 변수를 의미한다.
일반적으로 쉘 스크립트에서 정의되지만 쉘 세션에서도 사용될 수 있다.
쉘 변수를 할당하는 방법은 다음과 같다.
name="John"
쉘 변수는 문자열이나 숫자 혹은 배열도 가능하다.
환경변수
환경변수란 프로세스가 컴퓨터에서 동작하는 방식에 영향을 미치는, 동적인 값들의 모임입니다.
쉽게 말해서
PATH
,HOME
등 프로세스가 동작하는데 사용되는 운영체제의 전역 변수라고 생각하면 됩니다.쉘에서 환경변수를 조작하는 방법은 다음과 같이 3가지가 있습니다.
envp
매개변수environ
전역변수getenv()
함수environ, envp, getenv()
이들이 가져오는 환경변수가 정확히 어디에 저장되어있는지 확인하기 위해 다음과 같이 각각의 방식으로 환경변수
TEST
를 주소와 함께 출력하는 테스트(env_test
)를 사용했습니다.테스트 코드를 실행하기 전에 다음 명령어로
TEST
라는 환경변수를 설정해야합니다.export TEST=test
테스트 결과를 보면 다음과 같습니다.
테스트 결과 모두 같은 주소를 가리키고 있음을 알 수 있었습니다.
envrion
과envp
는 모두 같은 문자열 배열을 가리키고 있고getenv()
함수를 사용할 경우 해당 문자열 배열의 value 부분("key=value
" 형식의 문자열에서=
뒷부분)을 가리키고 있음을 알 수 있다.envp 변수에 할당되는 시점
그렇다면
envp
변수에 환경변수 문자열 배열이 저장되는 시점은 언제일까?이를 확인하기 위해
execve()
함수를 사용하여 위의 테스트(env_test
)를 실행하는 테스트(exec_test
)를 작성했다.만약
execve()
에서 3번째 매개변수(envp
)에NULL
을 전달하면 쉘에서 환경변수가 설정되어 있더라도 다음과 같이 전달되지 않는 모습을 볼 수 있다.다른 테스트 케이스를 확인하기 위해 직접 문자열 배열을 만들어서 전달해보았다.
태스트 결과 다음과 같이 잘 출력된다.
즉, 환경변수 문자열 배열은
execve()
와 마찬가지로main()
이 실행되기 전에environ
변수에 저장이 되고, 해당 값이envp
매개변수로 전달된 것이라고 예상할 수 있다.env 명령어로 쉛 변수를 환경변수로 지정하기
env
명령어를 사용하면 특정 쉘 변수를 환경변수로 지정해서 다른 명령어를 실행할 수 있습니다.env
명령어를 사용해서 환경변수로 지정된 쉘 변수는 다른 쉘 세션이나 자식 프로세스에 영향을 끼치지 않습니다.이를 알아보기 위해 env_test를 실행할 때 다음과 같은 명령어를 사용해서 테스트를 했습니다.
위 명령어를 실행하면 다음과 같은 결과가 나옵니다.
하지만 echo 명령어나 env를 출려갛여 확인해보면 쉘 변수나 환경변수로 저장되어 있지 않다는 것을 볼 수 있습니다.
env | grep TEST
즉, env에 매개변수로 전달된 쉘 변수는 해당 쉘 세션이나 환경변수로 저장되지 않는다는 것을 알 수 있습니다.
Beta Was this translation helpful? Give feedback.
All reactions