목차
1) 리눅스의 환경 변수(전역변수/지역변수)
2) 사용자 정의 변수
3) path 환경 변수 설정
4) 시스템 환경 변수
- 로그인 쉘 프로세스
- 대화형 쉘 프로세스
- 비대화형 쉘 프로세스
- 환경 변수를 영구적으로 만들기
bash 쉘은,,쉘 세션과 작업 환경에 대한 정보를 저장하기 위해 환경변수라는 기능을 사용합니다. 환경변수로 메모리에 데이터 저장하므로, 쉘에서 실행중인 모든 프로그램이나 스크립트가 데이터를 쉽게 사용할 수 있습니다.
bash 쉘의 환경 변수 유형
1) 전역 변수
2) 지역 변수

개별 환경 변수 값도 볼 수 있습니다
부모쉘,서브쉘 어디에서나 전역변수를 확인할 수 있습니다
변수를 정의한 지역 프로세스에서만 볼 수 있습니다. set 명령어를 통해 특정 프로세스에 대한 모든 변수를 출력
$ set
지역환경변수
전역환경변수
사용자가 정의한 변수 및 환경변수
...
...
...
envVSprintenvVSset
set : 지역환경변수까지!
$ echo $my_variable
$ my_variable=Hello
$ echo $my_variable
Hello
$ my_variable_plus="Hello world"
$ echo $my_variable_plus
Hello world
쉘 내에서만 사용 가능하므로, 자식쉘/부모쉘 끼리의 공유 불가능
export 명령으로 변수를 전역 환경변수로 만들기
1) 부모 쉘에서 변수를 전역 환경변수로 export
$ my_variable="Global"
$ export my_variable
$ echo $my_variable
Global
$ bash
$ echo $my_variable
Global
$ exit
$ echo $my_variable
Global
2) 자식 쉘에서 변수를 전역 환경변수로 export
부모쉘에서 생성한 전역 환경 변수를 자식 쉘에서 변경하면,(또한 값을 변경하고 값을 전역으로 export하고 싶더라도) 부모쉘 변수 값에는 영향이 없습니다.
$ my_variable="Global"
$ export my_variable
$ echo $my_variable
Global
$ bash
$ echo $my_variable
Global
$ my_variable="Null"
$ echo $my_variable
Null
$ exit
$ echo $my_variable
Global
$ echo $my_variable
Global
$ unset my_variable
$ echo $my_variable
부모쉘에서 지정된 전역변수는 자실쉘에서 unset한다고 적용되지 않습니다. 변수는 부모 쉘에서 unset 되어야합니다.
참고))
변수 자체에 어떤 조작을 할때에는 $ 표시 하지 말기!!
변수의 값으로 어떤 일을 할때(echo로출력) $ 표시 사용함
bash 쉘은 시스템 환경을 정의하기 위해 특정한 환경 변수를 사용합니다. 이러한 변수들은 항상 리눅스 시스템에 설정돼있거나 설정할 수 있습니다.
* CDPATH : cd 명령에 대한 검색 경로로 사용되는, 콜론으로 구분된 디렉토리 목록
* HOME : 현재 사용자의 홈 디렉토리
* PATH : 쉘이 명령을 찾을 때 쓸, 콜론으로 구분된 디렉토리 목록
* BASH : 현재 bash 쉘의 인스턴스를 실행하기 위한 전체 경로 이름
* BASH_ARSC : 서브루틴 또는 쉘 스크립트에 전달될 매개변수의 개수를 포함한 변수 배열
* BASH_COMMAND : 현재 실행되고 있거나 실행되려는 쉘 명령
* BASH_SOURCE : 현재 실행되고 있는 쉘 함수의 소스코드 파일 이름을 포함하는 변수 배열
* BASH_SUBSHELL : 서브 쉘 환경의 현재 단계(초기값 0)
* BASH_VERSION : bash 쉘의 현재 인스턴스의 버전 번호
* BASHPID : 현재 bash 프로세스의 프로세스 ID
* ENV : 설정되어있으면 bash 쉘 스크립트가 실행되기 전에 정의된 시동 파일을 실행
...
...
path 환경변수는 명령과 프로그램을 검색하는 디렉토리를 정의합니다.
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
콜론으로 구분된 8개의 디렉토리는, 쉘 명령 및 프로그램을 찾는 디렉토리가 8개 있다는 것을 의미합니다.
명령 또는 프로그램 위치가 PATH에 포함되어있지 않으면 쉘은 절대 디렉토리 참조 없이는 이를 찾을 수 없습니다.
$ myprog
-bash: myprog: command not found
문제 : 응용 프로그램이 PATH 환경 변수에 없는 디렉토리에 실행 프로그램을 배치할때
해결 : 처음부터 PATH 환경변수를 재정의 할 필요없이 기존의 PATH에 새로운 검색 디렉토리를 추가
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
$ PATH=$PATH:/home/christine/Scripts
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/christine/Scripts
$ myprog
The factorial of 5 is 120
또한, PATH 환경변수에 디렉토리를 추가하면 가상 디렉토리 구조 안에 있는 어떤 프로그램이든 바로 실행할 수 있습니다
$ cd /etc
$ myprog
The factorial of 5 is 120
프로그램 위치를 서브쉘에서도 사용할 수 있게 하려면 수정된 PATH 환경 변수를 export 해야 합니다.
하지만, 여기까지 진행한 변경사항은 영구적이지 않습니다. 이를 영구적으로 저장하려면? 다음 파트를 확인해주세요
⭐️ 참고 ⭐️
MySQL/Oracle 등을 설치할 때 bin 폴더를 환경변수에 넣어주는 과정이 있음!!
⭐️ 추가 ⭐️
운영서버 환경변수 한 번 확인해보기
bash 쉘이 실행되는 3가지 방법
1) 로그인 할 때 기본 로그인 쉘
2) 서브쉘을 생성함으로써 실행되는 대화형 쉘
3) 스크립트를 실행시키기 위한 비대화형 쉘
bash 쉘이 어떻게 실행되는지에 따라 처리하는 시동파일이 각각 다르다
로그인 쉘은 다섯개의 파일을 찾아서 이로부터 명령을 실행합니다.
(기본 시동 파일)우분투 /etc/profile
/etc/bash.bashrc파일 안에 시스템 환경 변수 포함centos /etc/profile
/etc/bash.bashrc파일 부르지 않음우분투 & centos 공통점
/etc/profile.d디렉토리 안에 있는 모든 파일을 차례대로 실행시키는 for 구문 기능 존재(리눅스 시스템이 로그인할 때 쉘이 실행하는 응용 프로그램별 시동 파일을 배치 할 수 있는 장소 제공)
위 4개 파일은 사용자의 특정한 환경 변수를 정의하기 위해서는 사용자 특정 시동 파일이 필요한데, 그 사용자 특정 시동 파일을 제공하기 위한 것입니다. 아래의 목록 순서에 따라 가장 처음 발견되는 파일만이 실행되며, 나머지는 무시됩니다.
$/HOME/.bashrc 파일은 다른 파일들 중 한 곳 안에서 실행됨
아래는 centos 리눅스 시스템
.bash_profile파일 내용입니다..bash_profile시동 파일은 먼저 HOME 디렉토리에.bashrc시동 파일이 있는지 확인하고 만약 있다면.bashrc시동파일을 실행합니다.
시스템에 로그인하지 않고 (bash라고만 입력해서) bash 쉘을 시작하면 대화형 쉘이 시작됩니다.
제가 생각했을 때, 회사 hcon 접속했을때, ssh 로 접속하기 때문에 로그인정보를 요구합니다. 따라서 로그인 쉘이며, 현재 로컬에서 실행하는 zsh 쉘은 로그인하지 않고도 사용할 수 있기 때문에 비로그인 쉘이라고 생각합니다. 또한 ssh 로 접속한 다음 bash 명령어로 서브쉘을 생성하는 것도 비로그인 쉘이 아닐까 생각합니다.
대화형 쉘로 실행되면 로그인 쉘과 달리 /etc/profile 파일을 확인하지 않고, 사용자의 HOME 디렉토리에 있는 .bashrc 파일만 확인합니다.
아래는 centos 리눅스 시스템
.bashrc파일 내용입니다.# .bashrc if [ -f /etc/bashrc ]; then . /etc/bashrc fi
참고) 이 .bashrc 파일 안에 운영서버 pyenv 실행 path 들이 들어있음
비대화형 쉘은 쉘 스크립트 실행을 시작할 수 있는 쉘입니다. CLI 프롬포트가 없다는 특징을 가집니다.
쉘이 비대화형 서브쉘 프로세스로 실행될 때, 쉘은 실행시킬 시동 파일 이름을 BASH_ENV 환경변수에서 찾습니다. 보통 이 파일은 쉘 스크립트를 위한 변수의 모음을 포함하고 있습니다.
하지만,centos나 우분투 환경에서 이 BASH_ENV 환경변수의 값은 기본적으로 설정되어있지 않습니다.
그렇다면, 쉘 스크립트는 어떻게 이 환경 변수를 사용할 수 있을까요?
바로 부모쉘이 로그인쉘이라면,,
/etc/profile,/etc/profile.d/*.sh,$HOME/.bashrc파일에 변수를 설정하고 export 했다면 스크립트를 실행시키는 자식 쉘은 이 변수를 상속받아 사용할 수 있기 때문입니다.
전역 환경 변수의 경우 ./etc/profile안에 새로운 변수 값을 넣거나 값을 변경하고 싶을 수 있겠지만, 이는 배포판이 업그레이드 될때 이 파일이 변경될 수 있기 때문에 좋은 생각은 아닙니다.
1) /etc/profile.d 디렉토리에 .sh 실행파일을 만들어서 새로 만들었거나 수정한 전역 환경 변수 설정을 모두 배치
2) $HOME /.bashrc 파일에 새로 만들었거나 수정한 전역 환경 변수 설정을 모두 배치
결론 = $HOME /.bashrc 시동 파일에 설정을 저장하면 영구적으로 사용할 수 있음
환경변수의 기능으로 변수를 배열로 사용할 수 있습니다. 하지만 자주 사용하진 않습니다. 그냥 이런 기능이 있다는 것만 알아봅시다!
$ mytest=(one two three four five)
$ echo ${mytest[2]}
three
$ echo ${mytest[*]}
one two three four five
$ mytest[2]=seven
$ echo ${mytest[*]}
one two seven four five