목차
1) 리눅스의 환경 변수(전역변수/지역변수)
2) 사용자 정의 변수
3) path 환경 변수 설정
4) 시스템 환경 변수
- 로그인 쉘 프로세스
- 대화형 쉘 프로세스
- 비대화형 쉘 프로세스
- 환경 변수를 영구적으로 만들기
bash 쉘은,,쉘 세션과 작업 환경에 대한 정보를 저장하기 위해 환경변수
라는 기능을 사용합니다. 환경변수
로 메모리에 데이터 저장하므로, 쉘에서 실행중인 모든 프로그램이나 스크립트가 데이터를 쉽게 사용할 수 있습니다.
bash 쉘의 환경 변수 유형
1) 전역 변수
2) 지역 변수
개별 환경 변수 값도 볼 수 있습니다
부모쉘,서브쉘 어디에서나 전역변수를 확인할 수 있습니다
변수를 정의한 지역 프로세스에서만 볼 수 있습니다. set
명령어를 통해 특정 프로세스에 대한 모든 변수를 출력
$ set
지역환경변수
전역환경변수
사용자가 정의한 변수 및 환경변수
...
...
...
env
VSprintenv
VSset
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