본문 바로가기
프로그래밍 놀이터/Script(Python)

[책 정리] 06. 리눅스 환경 변수 사용하기 - 리눅스 커맨드라인 쉘 스크립트 바이블

by 돼지왕 왕돼지 2020. 4. 25.
반응형

환경 변수 살펴보기


-

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



-

변수 배열은 문제를 복잡하게 만들어서 배열은 쉘 스크립트 프로그래밍에 잘 쓰이지 않는다.



반응형

댓글