환경 변수 살펴보기
-
bash 쉘은 쉘 세션과 작업 환경에 대한 정보를 저장하기 위해 환경변수라는 기능을 사용한다.
이 기능으로 메모리에 데이터를 저장할 수 있으므로 쉘에서 실행 중인 모든 프로그램이나 스크립트가 쉽게 사용할 수 있다.
이는 필요한 데이터를 영구히 저장하는 편리한 방법이기도 하다.
bash 쉘에는 두 가지 환경 변수의 유형이 있다.
1. 전역 변수
2. 지역 변수
* 전역 환경 변수 살펴보기
-
전역 환경 변수는 쉘 세션 및 그로부터 파생된 자식 서브쉘에서 볼 수 있다.
지역 변수는 이를 만든 쉘에서만 사용할 수 있다.
따라서 부모 쉘의 정보가 필요한 자식 서브쉘을 만드는 응용 프로그램에는 전역 환경 변수가 유용하다.
-
리눅스 시스템은 bash 세션을 시작할 때 여러 가지 전역 환경 변수를 설정한다.
거의 모든 시스템 환경 변수는 일반 사용자 환경 변수와 구별하기 위해 대문자만을 사용한다.
전역 환경 변수를 보려면 env 또는 printenv 를 사용한다.
특정 환경 변수 값을 보려면 printenv 만 사용할 수 있다.
$ printenv HOME
전역변수 앞에 $ 를 붙이면 변수참조처럼 쓸 수 있다.
$ echo $HOME
$ ls $HOME
* 지역 환경 변수 살펴보기
-
지역변수를 표시하는 명령은 존재하지 않는다.
set 명령은 특정 프로세스에 대한 모든 변수를 표시하며, 지역 및 전역 환경 변수와 사용자 정의 변수를 모두 포함한다.
$ set
env 나 printenv 에 표시되는 녀석들은 set 에 전부 포함되어 있다.
사용자 정의 변수 설정하기
* 사용자 정의 지역 변수 설정하기
-
$ my_var=Hello
$ echo $my_var
빈 칸이 포함된 문자열 값을 지정해야 할 경우 홑 혹은 쌍따옴표를 사용하면 된다.
변수 이름, 등호, 값 사이에 빈 칸을 사용하지 않는 것이 매우 중요하다.
빈 칸이 있는 경우 bash 는 별개의 명령으로 값을 해석한다.
표준 bash 쉘 규칙은 모든 환경 변수가 대문자를 사용하는 것이다.
* 전역 환경 변수 설정하기
-
전역 환경 변수는 이를 설정한 부모 프로세스가 만든 모든 자식 프로세스에서 쓸 수 있다.
전역 환경 변수를 만들려면 먼저 지역 변수를 생성하고 이를 export 하면 된다.
$ my_var="I am global now"
$ export my_var
자식 쉘에서 이 값을 변경한 것이 부모의 값에 영향을 주지 않는다.
export 를 해도 부모는 영향을 받지 않는다.
환경 변수 제거하기
-
unset 명령을 사용하여 환경 변수를 제거할 수 있다.
$ unset my_var # $ 를 쓰지 않는다.
전역 환경 변수의 경우 자식 프로세스에서 전역 환경변수를 unset 해도 이는 자식 프로세스에만 적용된다.
해당 전역 환경 변수는 부모 프로세스에서 계속 사용할 수 있다.
환경 변수에서 언제 달러 기호를 사용하고 사용하지 않아야 하는지를 기억하기 어려울 텐데 이 점만 기억하면된다.
변수의 값으로 어떤 일을 할 때는 달러 기호를 사용한다.
변수 자체에 대한 어떤 조작을 한다면 달러 기호를 사용하지 말라.
이 규칙의 예외는 printenv 명령을 사용할 때 뿐이다.
기본 쉘 환경 변수 들여다보기
-
bash 쉘은 시스템 환경을 정의하기 위해 특정한 환경 변수들을 사용한다.
이러한 변수들은 항상 리눅스 시스템에 설정되어 있거나 설정할 수 있다.
bash 쉘은 원래의 유닉스 Bourne 쉘에서 파생되어 왔기 때문에 원래의 쉘에서 정의한 환경 변수도 포함한다.
HOME : 현재 사용자의 홈 디렉토리
PATH : 쉘이 명령을 찾을 때 쓸, 콜론으로 구분된 디렉토리 목록
PS1 : 기본 쉘 커맨드라인 인터페이스 프롬프트 문자열
...
PATH 환경 변수 설정하기
-
외부 명령을 입력하면 쉘은 프로그램을 찾기 위해 시스템을 검색한다.
PATH 환경변수는 명령과 프로그램을 검색하는 디렉토리를 정의한다.
기존의 PATH 에 PATH 를 추가하려면..
$ PATH=$PATH:/home/christine/Scripts
현재 위치를 추가하는 것도 좋은 방법인데 . 을 사용하면 된다.
$ PATH=$PATH:.
시스템 환경 변수 찾기
-
bash 쉘을 시작할 때 bash 는 명령에 관한 여러 개의 파일을 검사한다.
이 파일을 시동 파일 또는 환경 파일이라고 한다.
bash 쉘이 시작 단계에서 처리하는 시동 파일은 bash 쉘을 실행하기 위해서 사용하는 방법에 따라 달라진다.
bash 쉘은 다음 세 가지 방법으로 실행된다.
1. 로그인 때 기본 로그인 쉘
2. 서브쉘을 생성함으로써 실행되는 대화형 쉘
3. 스크립트를 실행시키기 위한 비대화형 쉘
* 로그인 쉘 프로세스 이해하기
-
리눅스 시스템에 로그인하면 bash 쉘은 로그인 쉘로 실행된다.
로그인 쉘은 보통 다섯 개의 파일을 찾아서 이로부터 명령을 실행하려고 한다.
1. /etc/profile
2. $HOME/.bash_profile
3. $HOME/.bashrc
4. $HOME/,bash_login
5. $HOME/.profile
/etc/profile 파일은 시스템에서 bash 쉘의 주요 기본 시동 파일이다.
로그인할 때 시스템의 모든 사용자는 이들 시동 파일을 실행한다.
-
일부 리눅스 배포판은 PAM(Pluggable Authentication Modules)을 사용한다는 점에 유의해야 한다.
bash 쉘이 시작되기 전에 PAM 파일이 처리되며, 이들 가운데 환경 변수를 포함한 것이 있을 수도 있다.
PAM 파일의 예는 /etc/environment 및 $HOME/.pam_environment 파일과 같은 것들이 있다.
** /etc/profile 파일 살펴보기
-
/etc/profile 파일은 bash 쉘의 주요 기본 시작 파일이다.
리눅스 시스템에 로그인할 때마다 bash 는 /etc/profile 시동 파일에 있는 명령을 실행한다.
여기서는 보통 bashrc 를 언급하는데, 이곳에는 환경변수가 정의되어 있다.
/etc/profile.d 라는 폴더가 있는 배포판들이 있는데, 보통 /etc/profile 에서는 그 안에 있는 스크립트들을 수행시킨다.
(.sh 는 bash 쉘 스크립트, .csh 은 c 쉘 스크립트)
** $HOME 시동 파일 살펴보기
-
아래 네 가지 시동 파일 가운데 하나 또는 두 가지만 사용한다.
$HOME/.bash_profile
$HOME/.bashrc
$HOME/.bash_login
$HOME/.profile
이들은 . 으로 시작하는 숨겨진 파일들이다.
HOME 디렉토리에 있기 때문에 각 사용자는 파일을 편집하고 자신만의 환경 변수를 추가해서 이들이 bash 쉘을 시작할 때마다 활성화되도록 할 수 있다.
다음 목록에 나오는 순서에 따라 처음 발견되는 파일만이 실행되며 나머지는 무시된다.
$HOME/.bash_profile
$HOME/.bash_login
$HOME/.profile
$HOME/.bashrc 파일은 보통 위의 파일들 중 한 곳에서 실행된다.
* 대화형 쉘 프로세스 이해하기
-
시스템에 로그인하지 않고 bash 쉘을 시작하면 (CLI 프롬프트에서 bash 라고만 입력했다면) 대화형 쉘이라고 하는 것이 시작된다.
bash 쉘이 대화형 쉘로 실행되면 /etc/profile 파일을 처리하지 않는다.
대신 사용자의 HOME 디렉토리에 있는 .bashrc 파일만 확인한다.
* 비대화형 쉘 프로세스 이해하기
-
시스템이 쉘 스크립트 실행을 시작할 수 있는 쉘로 CLI 프롬프트가 없다는 점에서 다른 유형과 다르다.
그러나 시스템이 스크립트를 시작할 때마다 특정한 시동 명령을 실행시키기를 원할 수도 있다.
이러한 바람을 수용하기 위하여 bash 쉘은 BASH_ENV 환경 변수를 제공한다.
쉘이 비대화형 서브쉘 프로세스로 실행될 때, 쉘은 실행시킬 시동 파일 이름을 이 환경 변수에서 찾는다.
여기에 값이 없어도 보통 자식 쉘은 부모 쉘의 변수를 상속하기 때문에 충분할 수 있다.
환경 변수를 영구적으로 만들기
-
전역 환경 변수의 경우 /etc/profile 안에 새로운 변수를 넣거나 값을 바꾸고 싶을 수 있겠지만 이는 잘못된 생각이다.
배포판이 업그레이드 될 때 이 파일이 변경될 수 있으며 그렇게 되면 수정했던 모든 사용자 정의 변수 설정을 잃게 된다.
좀 더 나은 방법은 /etc/profile.d 디렉토리에 .sh 로 끝나는 파일을 만드는 것이다.
이 파일에 새로 만들었거나 수정한 전역 환경 변수 설정을 모두 배치한다.
-
대부분의 배포판에서 개별 사용자의 영구적인 bash 쉘 변수를 저장하기 좋은 장소는 $HOME/.bashrc 파일이다.
이는 모든 유형의 쉘 프로세스에 대해 적용된다.
하지만 BASH_ENV 변수가 설정되어 있다면 이 변수가 $HOME/.bashrc 를 가리키지 않는 한 비대화형 쉘을 위한 사용자 변수를 어딘가 다른 곳에 저장해야 할 수 있다는 점을 잊지 말자.
또한 GUI 클라이언트와 같은 그래픽 인터페이스 요소에 대한 사용자 환경 변수는 bash 쉘 환경 변수를 설정하는 것과 다른 설정 파일에 설정해야 할 수도 있다.
변수 배열 알아보기
-
환경 변수에는 배열을 지정할 수도 있다.
$ my_array=(one two three four five) # comma 가 아닌 띄워 쓰기로 구분된다.
$ echo $my_array # index 0
$ echo ${my_array[2]} # index 2
$ echo ${my_array[*]} # 전체 표시
개별 위치의 값을 변경할 수도 있다.
$ my_array[3]=gamza
개별 위치의 값을 지우기 위해 unset 을 할 수도 있다.
$ unset my_array[3]
전체를 제거하기 위해서는 일반 변수와 같이 하면 된다.
$ unset my_array
-
변수 배열은 문제를 복잡하게 만들어서 배열은 쉘 스크립트 프로그래밍에 잘 쓰이지 않는다.
'프로그래밍 놀이터 > Script(Python)' 카테고리의 다른 글
[책 정리] 08-1. 파일 시스템 관리하기 - 리눅스 커맨드라인 쉘 스크립트 바이블 (0) | 2020.04.27 |
---|---|
[책 정리] 07. 리눅스 파일 사용 권한 이해하기 - 리눅스 커맨드라인 쉘 스크립트 바이블 (0) | 2020.04.26 |
[책 정리] 05. 쉘을 이해하기 - 리눅스 커맨드라인 쉘 스크립트 바이블 (0) | 2020.04.24 |
[책 정리] 04. 더 많은 bash 쉘 명령 - 리눅스 커맨드라인 쉘 스크립트 바이블 (0) | 2020.04.23 |
[책 정리] 03. 기본 bash 쉘 명령 - 리눅스 커맨드라인 쉘 스크립트 바이블 (0) | 2020.04.22 |
댓글