해당 포스팅은 William E. Shotts, Jr.의 오픈소스 저서 The Linux Command Line(링크)를 번역한 내용입니다
쉘은 쉘 세션동안 환경(environment)이라고 하는 정보를 유지합니다. 프로그램은 환경에 저장된 데이터를 사용하여 시스템의 현재 상태나 설정을 파악합니다. 대부분의 프로그램은 설정 파일(configuration files)을 사용하여 프로그램의 설정을 저장하지만, 일부 프로그램은 환경에 저장된 값들을 사용하여 그들 자신의 동작을 조정합니다. 이를 이용하면 환경을 사용해서 쉘 안에서의 동작을 제어할 수 있습니다.
이번 장에서는 다음 명령어들에 대해 배워보겠습니다:
- $\texttt{printenv}$ - 환경의 일부나 전체를 출력
- $\texttt{set}$ - 쉘 옵션 설정
- $\texttt{export}$ - 환경을 모든 자식 프로세스에 전파
- $\texttt{alias}$ - 명령의 별칭(alias)을 생성
쉘에는 무엇이 저장되어있나요?
쉘은 환경에 두 가지 데이터의 기본적인 유형을 저장합니다. $\texttt{bash}$에서는 구분하기 쉽지 않지만요. 그 두 가지는 환경 변수(environment variables)와 쉘 변수(shell variables)입니다. 쉘 변수는 $\texttt{bash}$가 만든 데이터 조각들이고, 환경 변수는 기타 모든 것들을 말합니다. 쉘은 변수 외에도 별칭(aliases)과 쉘 함수(shell functions)라는 프로그래밍된 데이터를 가집니다. 별칭에 대해서는 5장에서 언급했고 쉘 함수에 관해서는 Part 4에서 다룰 예정입니다.
환경 탐색하기
환경에 무엇이 저장되어 있는지 확인하기 위해서 $\texttt{bash}$의 빌트인인 $\texttt{set}$을 사용하거나 $\texttt{printenv}$ 프로그램을 사용할 수 있습니다. $\texttt{set}$ 명령어는 쉘과 환경 변수 모두를 보여주고, $\texttt{printenv}$는 환경 변수만 보여줍니다. 환경에 관한 내용이 매우 길기 때문에 $\texttt{less}$를 이용해 파이프를 짜는 것이 좋습니다.
위와 같이 입력하면 아래와 비슷한 내용을 볼 수 있습니다:
화면에 뜬 내용은 환경 변수와 그 값들입니다. 예를 들어, $\texttt{USER}$라는 변수를 보면 $\texttt{me}$라는 값을 저장하고 있음을 알 수 있습니다. $\texttt{printenv}$ 명령어를 사용해 특정 변수의 값만 확인하는 방법도 있습니다.
$\texttt{set}$ 명령어를 아무런 옵션과 인자 없이 사용하게 되면 쉘과 환경 변수, 그리고 쉘 함수까지 출력합니다. $\texttt{set}$은 친절하게도 $\texttt{printenv}$와 다르게 출력을 알파벳 순으로 정렬해줍니다.
$\texttt{echo}$ 명령어를 사용해 변수에 저장된 값을 확인할 수도 있습니다:
환경에 관련한 내용 중 $\texttt{set}$과 $\texttt{printenv}$ 둘 모두 출력하지 않는 내용이 있는데 바로 별칭(aliases)입니다. 별칭 목록을 보려면 $\texttt{alias}$를 인자없이 입력합니다.
몇 가지 흥미로운 변수들
환경은 여러 변수를 가지고 있습니다. 여러분의 환경과 아래 표에 나온 내용과는 차이가 있을 수 있으나 보통의 경우 표에 나온 변수들이 나올 것입니다.
Table 11-1: 환경 변수
변수 | 내용 |
$\texttt{DISPLAY}$ | 그래픽 기반 환경의 경우 디스플레이의 이름을 출력. 대개 ":0"이라는 결과를 볼 수 있으며 이는 X 서버가 만든 첫번째 디스플레이라는 것을 뜻함 |
$\texttt{EDITOR}$ | 텍스트 편집에 사용되는 프로그램의 이름 |
$\texttt{SHELL}$ | 기본 쉘 프로그램의 이름 |
$\texttt{HOME}$ | 홈 디렉토리의 경로명 |
$\texttt{LANG}$ | 현재 설정된 언어와 정렬 순서를 정의 |
$\texttt{OLDPWD}$ | 이전 작업 디렉토리 |
$\texttt{PAGER}$ | 페이징 출력을 위해 사용되는 프로그램의 이름. 대개 $\texttt{/usr/bin/less}$로 설정되어있음 |
$\texttt{PATH}$ | 실행 가능한 프로그램의 이름이 입력되었을 때 검색되는 경로가 콜론으로 구분되어있는 목록 |
$\texttt{PS1}$ | "prompt string 1"의 약자. 쉘 프롬프트의 내용을 정의함. 디테일한 커스터마이징이 가능(이후에 다룰 예정) |
$\texttt{PWD}$ | 현재 작업 디렉토리 |
$\texttt{TERM}$ | 터미널의 타입 이름. 유닉스 계열 시스템은 다양한 터미널 프로토콜을 지원함. 이 변수는 터미널 에뮬레이터가 사용한 프로토콜을 정의함 |
$\texttt{TZ}$ | 타임존을 표시. 대부분의 유닉스 계열 시스템은 UTC를 기준으로 내부의 시계를 유지하고 이 변수에 지정된 오프셋을 적용하여 현지 시간을 표시 |
$\texttt{USER}$ | 사용자명 |
배포판에 따라 다르므로 빠진 변수가 있더라도 걱정하지 마세요.
환경은 어떻게 수립되나요?
시스템에 로그인하면 $\texttt{bash}$ 프로그램이 시작되고 스타트업 파일(startup files)이라고 부르는 설정 스크립트들을 읽습니다. 스타트업 파일들은 모든 유저가 공유하는 기본 환경을 정의합니다. 그 뒤에는 홈 디렉토리에 위치한 개인적인 환경을 정의한 스타트업 파일을 읽습니다. 정확한 순서는 시작되는 쉘 세션의 유형에 따라 다릅니다. 이 유형은 두 가지가 존재합니다.
- 로그인 쉘 세션 로그인 쉘 세션은 우리의 사용자명과 비밀번호를 묻는 프롬프트가 나오는 세션입니다. 예를 들어, 가상 콘솔 세션을 시작할 때가 이 경우에 해당합니다.
- 비로그인 쉘 세션 비로그인 쉘 세션은 GUI 환경에서 터미널 세션을 실행할 때가 이 경우에 해당합니다.
로그인 쉘은 하나 이상의 스타트업 파일(아래 표 참고)을 읽습니다.
Table 11-2: 로그인 쉘 세션의 스타트업 파일들
파일 | 내용 |
$\texttt{/etc/profile}$ | 모든 유저에게 해당되는 전역적인 설정 스크립트 |
$\texttt{~/.bash_profile}$ | 사용자의 개인적인 스타트업 파일. 전역 설정 스크립트를 덮어쓰거나 연장하기 위해 사용됨 |
$\texttt{~/.bash_login}$ | $\texttt{~/.bash_profile}$이 없는 경우 $\texttt{bash}$는 이 스크립트를 읽음 |
$\texttt{~/.profile}$ | $\texttt{~/.bash_profile}$과 $\texttt{~/.bash_login}$ 둘 다 없는 경우 $\texttt{bash}$는 이 파일을 읽음. 이는 우분투와 같은 데비안 계열의 배포판의 기본 설정임 |
비로그인 쉘 세션은 Table 11-3의 스타트업 파일을 읽습니다.
Table 11-3: 비로그인 쉘 세션의 스타트업 파일들
파일 | 내용 |
$\texttt{/etc/bash.bashrc}$ | 모든 유저에게 해당되는 전역적인 설정 스크립트 |
$\texttt{~/.bashrc}$ | 사용자의 개인적인 스타트업 파일. 전역 설정 스크립트를 덮어쓰거나 연장하기 위해 사용됨 |
Table 11-3에 소개된 스타트업 파일들을 읽는 것 외에도, 비로그인 쉘은 부모 프로세스(주로 로그인 쉘)로부터 환경을 상속 받습니다.
여러분의 리눅스에는 어떤 스타트업 파일들이 설치되어 있는지 확인해보세요. 대부분의 파일명이 마침표로 시작하기 때문에(숨김처리 되기 때문에) $\texttt{ls}$에 "-a" 옵션을 주어야 확인할 수 있다는 점을 기억하세요.
$\texttt{~/.bashrc}$ 파일은 일반 사용자 관점에서 아마 가장 중요한 스타트업 파일일 것입니다. 왜냐하면 쉘이 거의 항상 이 파일을 읽기 때문이죠. 비로그인 쉘은 기본적으로 이 파일을 읽으며, 로그인 쉘을 위한 대부분의 스타트업 파일은 $\texttt{~/.bashrc}$를 읽도록 작성됩니다.
스타트업 파일에는 어떤 내용이 있나요?
$\texttt{.bash_profile}$의 내용을 보면 대략 이런 모습입니다:
"#"으로 시작하는 줄은 코멘트, 즉 문서를 읽는 사람을 위해 작성된 내용으로 쉘이 읽는 부분이 아닙니다. 쉘이 읽는 부분은 네 번째 줄부터 시작됩니다:
이를 if 복합 명령(if compound command)이라고 합니다. 더 자세히는 Part 4에서 다룰 예정이며 지금으로서는 아래와 같이 해석된다는 점만 이해하세요:
이 코드 조각으로 인해 쉘이 $\texttt{.bashrc}$의 내용을 가지고 올 수 있게 된다는 것을 알 수 있습니다. 스타트업 파일의 다음 부분은 $\texttt{PATH}$ 변수와 관련돼있습니다.
우리가 커맨드 라인에 명령어를 입력할 때 쉘이 어디서 명령어를 찾아보는지 궁금한 적 없으셨나요? 예를 들어, 우리가 $\texttt{ls}$를 입력하면, 쉘은 $\texttt{/bin/ls}$ ($\texttt{ls}$ 명령어의 전체 경로명)를 찾기 위해 컴퓨터 전체를 검색하지 않습니다.대신 $\texttt{PATH}$ 변수에 입력된 디렉토리에서만 검색을 하죠.
$\texttt{PATH}$ 변수는 종종(배포판에 따라 항상은 아님) $\texttt{/etc/profile}$ 스타트업 파일에 의해 다음과 같이 정의됩니다:
위 코드는 $\texttt{PATH}$의 마지막에 디렉토리 $\texttt{\$HOME/bin}$을 추가합니다. $\texttt{\$PATH:\$HOME/bin}$ 부분은 파라미터 확장의 예로, 7장에서 다룬 내용입니다. 어떻게 작동하는지 궁금하다면 아래를 따라해 보세요:
이 기법을 이용하면 변수의 내용 뒤에 텍스트를 추가할 수 있습니다.
$\texttt{PATH}$의 마지막에 $\texttt{\$Home/bin}$을 추가함으로써 커맨드가 입력되었을 때 검색될 목록에 디렉토리 $\texttt{\$HOME/bin}$이 추가되었습니다. 이는 홈 디렉토리에 개인 프로그램을 저장할 디렉토리를 만들고 싶을 때 유용합니다. 쉘이 이 디렉토리를 검색할 수 있도록 디렉토리명을 $\texttt{bin}$이라고만 지어주면 됩니다.
Note: 많은 배포판에서 $\texttt{PATH}$ 세팅을 기본적으로 제공합니다. 우분투와 같은 데비안 계열의 배포판에서는 로그인과 동시에 $\texttt{~/bin}$의 존재성을 검사하고, 이 디렉토리가 존재할 경우 자동으로 $\texttt{PATH}$에 추가되도록 설정되어있습니다.
마지막으로 볼 부분은
입니다. $\texttt{export}$ 명령어는 $\texttt{PATH}$의 내용이 쉘의 자식 프로세스에도 적용되도록 합니다.
환경 수정하기
스타트업 파일이 어디에 있고 어떤 내용을 담고 있는지 알았으니 이제 환경을 커스터마이즈 해보겠습니다.
어떤 파일들을 수정해야 하나요?
일반적인 규칙에 따라 $\texttt{PATH}$에 디렉토리를 추가하거나 추가적인 환경 변수를 정의하고 싶다면, 해당 수정 사항을 $\texttt{.bash_profile}$(혹은 그에 상응하는 파일, 예를 들어 우분투의 경우에는 $\texttt{.profile}$)에 저장하세요. 나머지의 경우에는 수정 사항을 $\texttt{.bashrc}$에 저장하세요.
Note: 여러분이 시스템 관리자거나 시스템의 모든 유저를 대상으로 기본 설정을 바꾸려는 게 아니라면, 수정 사항은 홈 디렉토리 내의 파일에만 반영하도록 하세요. $\texttt{/etc}$에 있는 $\texttt{profile}$과 같은 파일들도 수정이 가능하지만 대부분의 경우에 민감한 작업입니다. 그러니 지금 당장은 안전을 유지하도록 합시다.
'리눅스 > Part 2 - Configuration and Environment' 카테고리의 다른 글
리눅스 기초 | 12-1. vi 입문 (0) | 2024.06.06 |
---|---|
리눅스 기초 | 11-2. 환경 (0) | 2024.06.05 |