Home » OS » 리눅스 » linux export 명령에 대해 알아봅시다.

linux export 명령에 대해 알아봅시다.

linux export 명령어는 환경 변수를 추가하는 역할을 합니다. 예를 들어, aws 서비스의 계정 정보로 로그인을 하기 위해 AWS_PROFILE 변수를 추가하는 작업을 export로 할 수 있습니다. 딥한 내용은 다음에 알아보기로 하고, 이 글에서는 간략하게 훑어보도록 하겠습니다.


linux export 명령어 알아보기

이 글에서 사용할 명령어는 크게 3가지입니다. 추가, 삭제, 조회

  • export VARIABLE=VALUE
  • echo $VARIABLE
  • unset VARIABLE

이 3가지를 간략하게 봅시다. 먼저, export VARIABLE=VALUE는 환경 변수 VARIABLE의 값을 VALUE로 설정합니다. 예를 들어, 환경 변수 AWS_PROFILE의 값을 CHO로 하고 싶다고 해 봅시다. 그러면, export AWS_PROFILE=CHO를 입력하시면 됩니다.

만약에, 환경 변수 JAVA_HOME을 조회하고 싶으면 어떻게 하면 될까요? echo $JAVA_HOME을 입력하면 됩니다. 없으면 공백으로 조회될 것입니다. 변수를 삭제하는 것은 unset을 이용합니다. 이제, 하나씩 보도록 할게요.

[그림 1] 현재 세션 보기

먼저 터미널에 echo $$을 입력합시다. 이 $$는 현재 쉘의 pid를 나타내는 것입니다. 쉘 또한 프로세스인데요. 이 id와 세션이 관련이 있다. 정도만 알아두시면 됩니다. 8306이 나왔군요.

[그림 2] 환경 변수 AAA

이 세션에 AAA를 추가해 보겠습니다. linux export 명령을 이용해서요. export AAA=3을 입력했으니, 변수 AAA의 값은 3이 됩니다. 정말 그런지 echo $AAA로 확인해 보니까, 3이 출력되었습니다. id가 8306인 세션에서 유효합니다.

[그림 3] 현재 shell 에서 sh 명령어를 실행

이제, 8306번 세션에서 sh 명령어를 실행합니다. 그리고 환경 변수 AAA의 값과 pid를 출력합니다. 변수 AAA의 값은 3이 나왔어요. 8306번 세션의 환경변수 값을 그대로 물려받았어요. 그런데 echo $$를 입력하니, 8471이 나왔어요. pid는 8306이 아니니, 쉘 위에 띄워진 무언가라는 것이에요.

[그림 4] pstree 실행하기

pstree로 현재 프로세스와 부모 프로세스들의 정보를 봅시다. ubuntu에서는 -aps 옵션을 넣으면 됩니다. 그러면, 8471번 프로세스의 부모로 8306 zsh가 있음을 볼 수 있어요. 8306은 제가 띄워놓은 zsh 쉘, 그리고 그림 1에서 출력된 id와 일치합니다.

[그림 4]까지 보고 아래 사실을 정리할 수 있어요.

  • 현재 세션에서 export AAA=3 명령어를 실행하면 세션의 환경변수 AAA의 값은 3이 된다.
  • 세션에서 다른 세션을 자식으로 띄우면, 자식은 부모의 AAA의 값은 그대로 가져온다.

그런데, 환경 변수 AAA가 부모 쉘에 있다고 해도, 자식 쉘에 AAA가 있을 수 있을까요? 아래를 보면 그렇지 않음을 알 수 있어요.


unset 명령어

먼저, 8471번 세션, bash에서 unset AAA를 수행해 보겠습니다.

[그림 5] bash에서 unset AAA 수행하기

결과는 어떻게 나올까요? 8471번 세션에서는 AAA를 제거했으니, AAA 변수를 출력하려고 하면 아무것도 나오지 않을 것입니다. 당연한 이야기입니다. 다시 부모 쉘로 돌아가 보겠습니다. exit를 입력합시다.

[그림 6] 8306번 세션

8306번 세션에서 환경 변수 AAA의 값을 출력합니다. 그랬더니 3이 출력되었습니다. 분명 8471번에서는 AAA를 unset 했습니다. 그런데, 8306번 세션에는 그대로 남아 있습니다. 왜? 이는 두 개의 세션이 환경 변수 AAA에 대한 것을 별개로 관리하기 때문입니다.

8306번 세션, 즉, 8306번 쉘에서 sh 명령어를 호출한 후의 모습입니다. 8471번 쉘이 환경변수 AAA에 대한 정보를 가지고 있었습니다. 그런데, unset AAA를 8471번에서 했습니다.

그러면 8471번의 AAA만 지워질 뿐 8306의 AAA는 지워지지 않습니다. 이는, 환경 변수 AAA에 대한 것이 8471에도 복사 되었기 때문입니다. 그런데, 후처리 unset으로 인해 8471의 AAA가 없어졌습니다. 고로, 상황에 따라서는 부모 쉘에 환경 변수 AAA가 있었다고 해도, 자식 쉘에 AAA가 있지 않을 수도 있습니다.

su 명령어를 호출할 때도 비슷합니다.


su 명령어 호출하기

su 명령어는 아시다시피, 다른 사용자의 권한으로 쉘을 띄워버립니다. 물론, 로그인한 유저는 로그아웃을 하지 않고요.

[그림 7] su 명령으로 사용하기

su 명령어를 실행하고 나서 echo $$를 입력했더니, 8529가 나왔습니다. 8306과는 다른 값임을 알 수 있어요. pstree로 8529번의 부모 pid가 어떤 것인지 조회해 봅시다.

[그림 8] 8529의 부모 프로세스 조회하기

8529의 부모는 8528이고, 8528의 부모는 8306임을 알 수 있어요. 8306은 cho가 로그인 했던 shell이고, 그림 1에서 보았던 값입니다. 그러면 8306의 자식의 자식이 8529이니까 환경 변수 AAA가 있어야 할 것 같습니다. 그런데 echo 명령어를 쳐 보면 없다는 것을 알 수 있습니다.

[그림 9] 환경변수 AAA의 값 조회하기

왜 없을까요? su 명령어의 설명을 보면 그 이유를 대략적으로 알 수 있습니다.

[그림 10] su 명령어의 -l 옵션

1번과 2번이 중요합니다. 모든 환경 변수들을 clear 하는데, TERM과 특별한 무언가를 제외한다. 그리고 2번은 HOME, SHELL, USER, LOGNAME, PATH를 초기화 한다고 되어 있습니다. 이를 통해 알 수 있는 사실은 2가지가 있습니다.

  • 자식 쉘임에도 clear 되는 환경 변수가 있을 수 있다. 옵션을 통해 이를 제외시킬 수 있다.
  • 특수한 환경 변수들은 초기화가 된다.

[그림 11] -w 옵션

환경 변수가 clear 되지 않도록 하기 위해 -w 옵션을 쓸 수 있습니다. Don’t reset. 지우지 말라는 것입니다. comma separated 된 변수들에 대해서는 제외합니다. 이제, 다시 su 명령어를 사용해 봅시다.

[그림 12] su -w 옵션 적용하기

su -w AAA – 명령어를 입력합니다. 그러면, root 유저의 권한으로 쉘을 띄우는데요. AAA 환경 변수는 띄울 때 reset을 하지 않습니다. root shell 에서 echo $AAA를 호출했더니 3이 나왔습니다.


정리

여기까지 이 글의 내용을 정리하면 아래와 같습니다.

  • linux export 명령은 환경 변수를 추가하는 명령어입니다.
  • 현재 실행되고 있는 세션에 export AAA=3을 입력하면 AAA는 현재 세션에서 유효하다.
  • 자식 쉘에서도 유효할 수는 있는데, 경우에 따라 그렇지 않을 수도 있다.

현재 세션에서 exit를 하면 세션이 닫힙니다. 고로, 세션을 이용할 때만 환경 변수를 이용하려면, 현재 세션에서 export 명령을 입력하면 됩니다. AWS_PROFILE 같은 경우, 다른 세션에서 쓸 이유가 없기 때문에 적합한 상황 중 하나가 되겠습니다.

세션이 종료되어도 다시 연 경우 특정 환경 변수를 그대로 이용하고 싶은 경우도 있습니다. 이 때에는, 초기화 파일에 export를 넣습니다. 이는 다음 글에 알아보도록 합시다.

Leave a Comment

1 × 1 =