강좌
클라우드/리눅스에 관한 강좌입니다.
자격증 분류

리눅스마스터1급 : 리눅스 환경변수 활용하기

작성자 정보

  • 관리자 작성
  • 작성일

컨텐츠 정보

본문

리눅스마스터1: 리눅스 환경변수 활용하기

 

 




환경 변수

 

쉘에서 사용되는 매개 변수는 시스템에 이미 정의되어 있는 것과 사용자에 의해 정의되는 것 두 가지를 둘 수 있다.

 

 

 

 

이 두 가지는 적절히 혼합되어 사용될 수 있을 것이다.

 

 

 

 

특히 전자의 경우에는 일반적인 숫자나 문제와 함께 위치 매개 변수, 특별(Special) 매개 변수, 쉘 변수 등 세 가지 정도의 미리 정하여 제공되는 매개 변수 등으로 나누어 볼 수 있다.

 

 

 

 

특히 쉘 변수는 사용자가 쉘 환경을 설정하기 위해 사용되는 쉘의 환경 변수라고 할 수 있다.

 

 

 

 

 

쉘 변수는 리눅스 자체에 의해 만들어지고 유지되어지는 쉘 변수들로서, 이들은 앞에 $과 함께 적어서 사용한다(, $ENV). env 명령에 의해 이들 정보에 대해서 알 수 있다.

 

 

 

 

다음 쉘 변수들은 기본값이 제공되기는 하지만 사용자에 의해 설정이 가능한 것들이다.

 

 

 

 

이것들 중에서 중요한 것들은 다음과 같다.

 

 

 

 

 

 

LOGNAME

로그인 이름

IFS

내부 필드 구분자(Internal Field Separator)는 확장 후에 단어를 분리하고 read 내부 명령으로 읽은 행을 분리할 때 사용됨.

기본값은 “<스페이스><><개행문자>”.

PATH

명령을 찾을 검색 경로. 쉘이 명령을 찾아 볼 디렉토리 목록을 콜론으로 구분하여 지정. 기본값은 시스템에 따라 다르며 bash를 설치하는 관리자가 설정 가능. 일반적으로 “/usr/gnu/bin:/usr/local/bin: /usr/ucb:

/bin:/usr/bin:“ .

HOME

현재 사용자의 홈 디렉토리. cd 내부 명령의 기본 인수.

CDPATH

cd 명령에서 사용하는 검색 경로. cd 명령에서 사용한 목적지 디렉토리를 찾아 볼 디렉토리를 콜론으로 구분하여 적음.

예를 들어 “.:~:/usr”와 같은 값으로 설정.

ENV

bash가 쉘 스크립트를 실행할 때 매개변수가 설정되어 있으면, 그 값은 .bashrc와 같이 쉘을 초기화하는 명령을 담고 있는 파일의 이름으로 해석. The value of ENV 의 값은 경로명으로 해석되기 전에 매개변수 확장, 명령 치환, 연산 확장을 거쳐 설정됨. 결과로 나오는 경로명 검색에서 PATH는 사용하지 않음.

MAIL

이 매개변수가 파일 이름으로 설정되어 있고 MAILPATH 변수는 설정되어 있지 않으면, bash그 파일을 보고 메일의 도착 여부를 사용자에게 알려줌.

PS1

이 매개변수의 값을 확장하여 주 프롬프트 문자열로 사용.

기본값은 “bash\$”.

PS2

이 매개변수의 값을 확장하여 2차 프롬프트 문자열로 사용.

기본값은 “>”.

TERM

터미널 타입을 확인한다.

 

 

 

 

만약 vi로 편집하고 있다면, 이 변수를 설정하는 것은 중요하다.

 

 

 

 

 

TERMINFO

터미널에 대한 정보를 위해 검색된 디렉토리를 보여줌.

TZ

지역 시간(Time zone)을 정의(기본은 EST5EDT).

PWD

현재 디렉토리

 

 

 

 

3) 환경 변수 값 확인

 

 

하나씩 확인

 

 

 

 

 

 

# echo $변수명

또는

# printenv 변수명

 

 

 

 

 

 

 

 

다음 예제에서 echo 명령을 통해 쉘 변수들의 설정 상황을 알아보고 있다(echo는 결과값을 콘솔에 보여주라는 명령이다).

 

 

 

 

 

 

 

 

# echo $0

/bin/bash

# echo $$

4846

# echo $PWD

/root

# echo $PS1

[u@h W]$

# echo $PS2

>

 

 

 

 

 

 

 

 

 

 

 

위에서 $0에 대해 현재의 쉘인 /bin/bash라는 결과 값이 나왔고, $$에 대해서는 쉘 스크립트의 PID(프로세스 번호)가 나왔다.

 

 

 

 

그리고 $PWD에 대해서 /root라는 결과 값이 나온 것을 볼 수 있다.

 

 

 

 

그리고, $PS1 변수는 앞에서도 보았듯이 사용자가 접속을 하게 되면 명령을 받을 준비를 나타내는 프롬프트의 모양을 나타낸다.

 

 

 

 

그리고, $PS2 변수는 일반적으로 \ 등의 코드에 의해 계속 입력을 받을 경우 나타나며, 보통 > 로 설정되어 있다.

 

 

 

 

현재 설정된 변수 값 모두 확인

 

사용자가 현재 설정된 변수의 값을 모두 확인하려면 printenv 명령을 내리거나 env 뒤에 아무 것도 적지 않고 env 명령만 내리면 된다.

 

 

 

 

 

 

 

 

# printenv

또는

# env

 

 

 

 

 

 

 

4) 환경 변수 값 설정/변경

 

 

환경 변수 값을 설정하는 것은 env 명령 뒤에 환경 변수명=을 붙여서 명령을 내리는 방법, export 명령 뒤에 환경 변수명=을 붙여서 명령을 내리는 방법 및 “.bash_profile” 등의 환경 설정 파일을 직접 수정하는 방법이 있다.

 

 

 

 

그렇지만, 쉘을 실행할 때마나 환경 변수의 값이 동일하게 적용하려면 환경 설정 파일을 수정해야 한다.

 

 

 

 

다음은 현재의 쉘 환경의 쉘 변수 PATH의 값을 변경한 것이다.

 

 

 

 

다음 예에서 $PATH는 기존의 설정값을 말한다.

 

 

 

 

, 다음 예는 기존의 설정값에 새로운 내용을 추가하는 것이다.

 

 

 

 

 

# env PATH=/home:$PATH

또는

# export PATH=/home:$PATH

 

 

 

 

 

 

 

I/O Redirection

 

방향 재지정(Redirection : 리다이렉션)이란 표준 입력이나 표준 출력을 꼭 키보드나 터미널로 하는 것이 아니라 임의로 방향을 바꿔 키보드가 아닌 파일로부터 입력을 받거나, 터미널로 출력하는 것이 아니라 파일로 출력하는 것을 말한다.

 

 

 

 

이러한 방향 재지정에는 표준 입력, 표준 출력 및 표준 에러의 3가지의 파일 서술자가 있다.

 

 

 

 

 

1) 표준 출력의 변경

표준 출력을 변경할 때는 > 또는 >>를 사용한다.

 

 

 

 

 

“cat > test”라는 명령을 예로 들어 알아보자. 이것은 임의의 파일을 작성할 때 사용할 수 있다.

 

 

 

 

원래 cat는 표준 입력인 키보드로부터 입력받은 내용을 표준 출력인 터미널로 보내는 명령인데, 이 경우는 표준 출력을 터미널이 아닌 test라는 파일로 변경한 경우이다(표준입력은 그대로 키보드이다).

 

 

, 키보드에서 입력한 내용이 터미널(화면)에 출력되지 않고 test 파일 속으로 입력되어 저장되는 것이다(만약 cat 명령으로 텍스트 파일을 읽도록 하고 >로 다른 파일로 표준 출력을 변경하면 이 파일의 내용이 다른 파일로 저장된다).

 

 

 

 

 

 

 

 

 

[freekgb@localhost ~]$ cat > test

이건 테스트입니다.

리눅스 커널은 자유롭게 복제, 수정 및 배포가 가능합니다.

[freekgb@localhost ~]$ ls

public_html test Mail ftp1.png

[freekgb@localhost ~]$ cat test

이건 테스트입니다.

리눅스 커널은 자유롭게 복제, 수정 및 배포가 가능합니다.

[freekgb@localhost ~]$

 

 

 

 

 

 

 

 

여기서 한 가지 주의할 것은 “cat > test” 명령에서 만약 test라는 파일에 어떤 내용이 들어 있었다면 그 내용은 지워지고 새로운 내용이 들어가게 된다.

 

 

 

 

이런 경우를 방지하려면 기존 내용은 그대로 두고 기존 내용의 다음에 새롭게 추가되는 형식으로 명령을 주어야 하는데, 이때에는 > 가 아닌 >>를 사용하면 된다(만약 cat 명령으로 텍스트 파일을 읽도록 하고 >>로 다른 파일로 표준 출력을 변경하면 이 파일의 내용이 다른 파일의 뒤에 새롭게 추가된다).

 

 

 

 

 

 

 

 

[freekgb@localhost ~]$ cat >> test

리눅스 커널은 GNU GPL에 따라 배포됩니다.

 

 

 

 

 

[freekgb@localhost ~]$ cat test

이건 테스트입니다.

리눅스 커널은 자유롭게 복제, 수정 및 배포가 가능합니다.

리눅스 커널은 GNU GPL에 따라 배포됩니다.

[freekgb@localhost ~]$

 

 

 

 

 

 

 

2) 표준 입력의 변경

표준 입력을 바꿀 때는 < 를 사용한다.

 

 

 

 

“cat < test”라는 명령을 예로 들어 알아보자. 이 경우 표준 출력은 그대로 터미널이며 표준입력은 키보드가 아닌 test라는 파일이다.

 

 

 

 

, 위의 예와는 반대로 표준 출력은 그대로 터미널로 하고 표준 입력을 키보드가 아닌 파일로 하는 경우이다.

 

 

 

 

이에 따라 그 결과로서 test 파일의 내용이 터미널에 표시된다.

 

 

 

 

이는 보통 파일의 내용을 볼 때 사용하는 “cat test”(test 파일의 내용을 보는 명령)와 결과는 동일하다.

 

 

 

 

 

 

 

 

 

[freekgb@localhost ~]$ cat < test

이건 테스트입니다.

리눅스 커널은 자유롭게 복제, 수정 및 배포가 가능합니다.

리눅스 커널은 GNU GPL에 따라 배포됩니다.

[freekgb@localhost ~]$

 

 

 

 

 

 

 

3) 표준 에러

 

 

 

 

 

 

[freekgb@localhost ~]$ soon

-bash: soon: command not found

[freekgb@localhost ~]$

 

 

 

 

 

 

 

위 예를 보면 soon이라는 명령을 내렸는데 그런 명령은 찾을 수 없다고 한다.

 

 

 

 

이와 같은 에러 메시지를 표준 에러(Standard error)라고 한다.

 

 

 

 

이런 에러 메시지를 화면상에는 보이지 않고 error라는 파일로 저장하려고 할 경우 아래와 같이 하면 된다.

 

 

 

 

 

[freekgb@localhost ~]$ soon 2> error

[freekgb@localhost ~]$ cat error

-bash: soon: command not found

[freekgb@localhost ~]$

 

 

 

 

 

 

 

 

위와 같이 하면 만약 지금 실행한 명령이 에러가 발생한 명령이라면 error라는 파일에 에러 메시지가 저장되어 보이고, 반대로 에러가 발생하지 않는 옳은 명령인 ls를 기입하면 에러 메시지는 보이지 않을 것이다.

 

 

 

 

에러 메시지가 발생하지 않기 때문에 파일이 새로 생성되기는 하지만 저장되는 정보는 없는 것이다.

 

 

 

 

 

 

위 예에서 2가 표준 에러를 의미하는 파일 기술자(File descriptor)이다.

 

 

 

 

‘0’은 표준 입력, ‘1’은 표준 출력을 의미한다.

 

 

 

 

따라서 위의 예에서 2>와 같이 기술하지 않는다면, 에러 메시지가 파일로 입력되지 않고 터미널상에 출력되고 생성된 파일에는 정보가 없는 상태가 된다.

 

 

 

 

그리고 2>로 기술한 상태에서 정상적인 명령을 내리면, 표준 에러가 출력되지 않고 명령의 결과가 터미널상에 출력되고, 2>는 표준 에러의 입력을 받아서 파일로 입력하므로 생성되는 파일에는 정보가 없는 상태가 된다.

 

 

 

 

 

 

지금까지의 내용을 종합해서 /(root) 아래에서 중간에 ‘linux’라는 단어를 포함하는 모든 파일을 찾아서 find라는 파일에 저장하고 에러 메시지는 err라는 파일에 저장하려고 할 경우에 아래와 같이 한다(전체를 검색하는 것이므로 시스템에 따라 시간이 오래 걸릴 수 있다).

 

 

 

, 1>이 정상적인 출력 메시지를 받고 2>이 에러 메시지를 받아서 각각 지정한 파일로 저장한다.

 

 

 

 

 

 

 

 

[freekgb@localhost ~]$ find / -name *linux* 1> find 2> err

 

 

 

 

 

화면상에는 아무런 내용도 보이지 않는다.

 

 

 

 

find의 내용을 보려면 “cat find”나 혹은 “vi find”와 같은 명령을 기입하면 파일의 내용이 출력될 것이다.

 

 

 

 

 

 

 

[freekgb@localhost ~]$ cat find | more

/home/freekgb/linux_work

[freekgb@localhost ~]$

 

 

 

 

 

 

 

 

그리고 err의 내용을 보면 아래와 같은 접근 거부의 에러 메시지가 보일 것이다.

 

 

 

 

 

 

 

 

[freekgb@localhost ~]$ cat find

find: /usr/libexec/utempter: 허가 거부됨

find: /usr/lib/audit: 허가 거부됨

find: /usr/local/mysql/var: 허가 거부됨

find: /usr/local/mysql_bak/var: 허가 거부됨

find: /usr/local/sysmangerone/log: 허가 거부됨

find: /usr/local/sysmangerone/tmp: 허가 거부됨

find: /usr/local/sysmangerone/db: 허가 거부됨

find: /usr/local/sysmangerone/conf: 허가 거부됨

find: /usr/lost+found: 허가 거부됨

find: /etc/racoon/certs: 허가 거부됨

find: /etc/audit: 허가 거부됨

...이하 생략...

 

 

 

 

 

 

 

이제 마지막으로 표준 에러 메시지를 파일이 아니고, 화면상에도 표시되지 않고 그냥 버려버리고 싶을 경우는 아래와 같이 한다.

 

 

 

 

 

 

 

 

[freekgb@localhost ~]$ find / -name *linux* 1> find 2> /dev/null

 

 

 

 

 

 

 

 

위와 같이 하면 에러 메시지는 /dev/null이라는 파일로 입력되어 저장되는 것이 아니고 그냥 버려진다.

 

 

 

4) 방향 재지정 방법 정리

 

 

Bourne 쉘과 C쉘에서의 입력과 출력 방향 전환 방법은 약간 차이가 있는데 아래와 같다.

 

 

 

기호

Bourne shell

C shell

>

표준 출력을 파일로 나타낸 기호

표준 출력을 새로운 파일로 나타낸 기호

>!-d

사용하지 않는다는 기호

표준 출력을 기존의 파일로 나타낸 기호

>>

표준 출력을 기존의 파일에 덧붙이거나 새로운 파일로 출력

표준 출력을 기존의 파일에 덧붙임

<

표준입력을 파일에서 받음

표준 입력을 파일에서 받음

>&

본 쉘에서는 사용하지 않음

표준 출력, 에러를 새로운 파일로 출력

>&!

본 쉘에서는 사용하지 않음

표준 출력, 에러를 기준의 파일로 출력

>>&

본 쉘에서는 사용하지 않음

표준 출력과 에러를 기존의 파일에 덧붙임

1>

표준 출력을 파일로 출력

C 쉘에서 사용하지 않음

2>

표준 에러를 파일로 출력

C 쉘에서 사용하지 않음

>&2

표준 출력,표준 에러를 결합하고, 결과를 표준출력으로 출력

C 쉘에서 사용하지 않음

 

 

 

 

위 사항들을 다음과 같이 응용해 보도록 한다.

 

 

 

표준 출력을 표준 에러로 보내기

이것은 어느 프로그램의 표준 출력을, 지정된 파일에 기록하는 대신 표준 에러 출력으로 보이는 것이다.

 

 

 

 

 

 

 

 

 

 

[freekgb@localhost ~]$ grep da * 1>&2

 

 

 

 

 

 

 

표준 에러를 표준 출력으로 보내기

이것은 프로그램에서의 표준 에러의 출력을 지정된 파일에 기록하는 대신 표준 출력으로 보이는 것이다.

 

 

 

 

 

 

[freekgb@localhost ~]$ grep * 2>&1

 

 

 

 

 

 

표준 에러와 표준 출력을 파일로 보내기

다음은 명령이 실행된 이후에 그 실행 결과로 나타나는 모든 출력(표준 출력과 표준 에러)/dev/null 파일로 보낼 것이므로(&> 또는 >&는 모든 출력을 동시에 리다이렉션한다) 시스템에는 아무런 정보도 남지 않게 된다.

 

 

 

 

 

 

 

 

 

 

[freekgb@localhost ~]$ rm -f $(find / -name core) &> /dev/null

 

 

 

 

 

 

 

 

 

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,056 명
  • 현재 강좌수 :  35,908 개
  • 현재 접속자 :  219 명