웹사이트 검색

Linux에서 환경 및 셸 변수를 읽고 설정하는 방법


소개

셸 세션을 통해 서버와 상호 작용할 때 셸이 동작 및 리소스에 대한 액세스를 결정하기 위해 컴파일하는 많은 정보가 있습니다. 이러한 설정 중 일부는 구성 설정에 포함되며 나머지는 사용자 입력에 의해 결정됩니다.

셸이 이러한 모든 설정과 세부 사항을 추적하는 한 가지 방법은 환경이라고 하는 유지 관리 영역을 통하는 것입니다. 환경은 시스템 특성을 정의하는 변수를 포함하는 세션을 시작할 때마다 쉘이 빌드하는 영역입니다.

이 가이드에서는 환경과 상호 작용하고 구성 파일을 통해 대화식으로 환경 및 셸 변수를 읽거나 설정하는 방법에 대해 설명합니다.

로컬 시스템이나 원격 서버를 사용하여 따라하려면 터미널을 열고 이 자습서의 명령을 실행하십시오.

환경 및 환경 변수의 작동 방식

셸 세션이 생성될 때마다 셸 프로세스와 하위 프로세스에서 사용할 수 있어야 하는 정보를 수집하고 컴파일하는 프로세스가 발생합니다. 시스템의 다양한 파일 및 설정에서 이러한 설정에 대한 데이터를 가져옵니다.

환경은 셸 프로세스가 설정을 가져오거나 설정하고 이를 하위 프로세스에 전달할 수 있는 매개체를 제공합니다.

환경은 키-값 쌍을 나타내는 문자열로 구현됩니다. 여러 값이 전달되는 경우 일반적으로 콜론(:) 문자로 구분됩니다. 각 쌍은 일반적으로 다음과 같습니다.

KEY=value1:value2:...

값에 중요한 공백이 포함된 경우 따옴표가 사용됩니다.

KEY="value with spaces"

이러한 시나리오의 키는 변수입니다. 환경 변수 또는 쉘 변수의 두 가지 유형 중 하나일 수 있습니다.

환경 변수는 현재 셸에 대해 정의되고 하위 셸 또는 프로세스에서 상속되는 변수입니다. 환경 변수는 셸에서 생성된 프로세스에 정보를 전달하는 데 사용됩니다.

쉘 변수는 설정 또는 정의된 쉘 내에 독점적으로 포함된 변수입니다. 현재 작업 디렉토리와 같은 임시 데이터를 추적하는 데 자주 사용됩니다.

일반적으로 이러한 유형의 변수는 일반적으로 모두 대문자를 사용하여 정의됩니다. 이를 통해 사용자는 다른 컨텍스트 내에서 환경 변수를 구별할 수 있습니다.

셸 및 환경 변수 인쇄

각 셸 세션은 자체 셸 및 환경 변수를 추적합니다. 몇 가지 다른 방법으로 이러한 항목에 액세스할 수 있습니다.

env 또는 printenv 명령을 사용하여 모든 환경 변수 목록을 볼 수 있습니다. 기본 상태에서는 정확히 동일하게 작동해야 합니다.

  1. printenv

셸 환경에는 다음 출력과 다른 값으로 설정된 변수가 많거나 적을 수 있습니다.

Output
SHELL=/bin/bash TERM=xterm USER=demouser LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca:... MAIL=/var/mail/demouser PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games PWD=/home/demouser LANG=en_US.UTF-8 SHLVL=1 HOME=/home/demouser LOGNAME=demouser LESSOPEN=| /usr/bin/lesspipe %s LESSCLOSE=/usr/bin/lesspipe %s %s _=/usr/bin/printenv

이것은 printenvenv의 출력에서 매우 일반적입니다. 두 명령의 차이점은 보다 구체적인 기능에서만 명백합니다. 예를 들어 printenv를 사용하면 개별 변수의 값을 요청할 수 있습니다.

  1. printenv PATH
Output
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

반면에 env를 사용하면 다음과 같이 일련의 변수 정의를 명령에 전달하여 프로그램이 실행되는 환경을 수정할 수 있습니다.

  1. env VAR1="value" command_to_run command_options

위에서 배운 것처럼 자식 프로세스는 일반적으로 부모 프로세스의 환경 변수를 상속하므로 값을 재정의하거나 자식에 대한 추가 변수를 추가할 수 있는 기회를 제공합니다.

printenv 명령의 출력에서 볼 수 있듯이 입력 없이 시스템 파일 및 프로세스를 통해 설정되는 환경 변수가 상당히 많습니다.

이들은 환경 변수를 보여주지만 쉘 변수는 어떻게 볼 수 있습니까?

이를 위해 set 명령을 사용할 수 있습니다. 추가 매개 변수 없이 set를 입력하면 모든 셸 변수, 환경 변수, 지역 변수 및 셸 함수 목록이 표시됩니다.

  1. set
Output
BASH=/bin/bash BASHOPTS=checkwinsize:cmdhist:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath BASH_ALIASES=() BASH_ARGC=() BASH_ARGV=() BASH_CMDS=() . . .

이것은 일반적으로 거대한 목록입니다. 출력량을 보다 쉽게 처리하기 위해 페이저 프로그램으로 파이핑할 수 있습니다.

  1. set | less

우리가 다시 받는 추가 정보의 양은 다소 압도적입니다. 예를 들어 정의된 모든 bash 함수를 알 필요는 없을 것입니다.

set이 POSIX 모드에서 작동하도록 지정하여 출력을 정리할 수 있습니다. 그러면 셸 함수가 인쇄되지 않습니다. 현재 환경을 변경하지 않도록 하위 셸에서 실행할 수 있습니다.

  1. (set -o posix; set)

그러면 정의된 모든 환경 및 셸 변수가 나열됩니다.

우리는 이 출력을 env 또는 printenv 명령의 출력과 비교하여 쉘 변수의 목록만 얻으려고 시도할 수 있지만 이것은 서로 다른 이유로 불완전할 것입니다. 이러한 명령이 정보를 출력하는 방법:

  1. comm -23 <(set -o posix; set | sort) <(env | sort)

set 명령이 따옴표로 묶인 값을 출력하는 반면 printenvenv 명령은 문자열 값을 인용하지 않습니다.

이렇게 하면 여전히 세션에서 설정되는 환경 및 셸 변수에 대한 좋은 아이디어를 얻을 수 있습니다.

이러한 변수는 모든 종류의 작업에 사용됩니다. 파일에 변경 사항을 쓰지 않고 프로세스 간 세션에 대한 영구 값을 설정하는 대체 방법을 제공합니다.

일반적인 환경 및 셸 변수

일부 환경 및 쉘 변수는 매우 유용하며 꽤 자주 참조됩니다.

  • SHELL: 입력한 명령을 해석하는 쉘을 설명합니다. 대부분의 경우 기본적으로 bash이지만 다른 옵션을 선호하는 경우 다른 값을 설정할 수 있습니다.< /리>
  • TERM: 쉘을 실행할 때 에뮬레이트할 터미널 유형을 지정합니다. 다양한 운영 요구 사항에 따라 다양한 하드웨어 터미널을 에뮬레이션할 수 있습니다. 하지만 일반적으로 이에 대해 걱정할 필요는 없습니다.
  • USER: 현재 로그인한 사용자입니다.
  • PWD: 현재 작업 디렉토리.
  • OLDPWD: 이전 작업 디렉토리. 이것은 cd -를 실행하여 이전 디렉터리로 다시 전환하기 위해 셸에서 보관합니다.
  • LS_COLORS: 색상 출력을 ls 명령에 선택적으로 추가하는 데 사용되는 색상 코드를 정의합니다. 다양한 파일 형식을 구분하고 사용자에게 더 많은 정보를 한눈에 제공하는 데 사용됩니다.
  • MAIL: 현재 사용자 사서함의 경로입니다.
  • PATH: 시스템이 명령을 찾을 때 확인할 디렉토리 목록입니다. 사용자가 명령을 입력하면 시스템은 실행 파일에 대해 이 순서대로 디렉토리를 확인합니다.
  • LANG: 문자 인코딩을 포함한 현재 언어 및 현지화 설정
  • HOME: 현재 사용자의 홈 디렉토리입니다.
  • _: 가장 최근에 실행된 명령.

이러한 환경 변수 외에도 자주 볼 수 있는 몇 가지 셸 변수는 다음과 같습니다.

  • BASHOPTS: bash가 실행될 때 사용된 옵션 목록입니다. 이는 셸 환경이 원하는 방식으로 작동하는지 확인하는 데 유용할 수 있습니다.
  • BASH_VERSION: 사람이 읽을 수 있는 형식으로 실행 중인 bash 버전입니다.
  • BASH_VERSINFO: 기계가 읽을 수 있는 출력의 bash 버전
  • COLUMNS: 화면에 출력을 그리는 데 사용되는 폭의 열 수입니다.
  • DIRSTACK: pushdpopd 명령으로 사용할 수 있는 디렉토리 스택.
  • HISTFILESIZE: 파일에 저장된 명령 히스토리 라인 수.
  • HISTSIZE: 메모리에서 허용되는 명령 히스토리 라인 수.
  • HOSTNAME: 현재 컴퓨터의 호스트 이름입니다.
  • IFS: 명령줄에서 입력을 구분하기 위한 내부 필드 구분 기호입니다. 기본적으로 공백입니다.
  • PS1: 기본 명령 프롬프트 정의입니다. 이것은 쉘 세션을 시작할 때 프롬프트 모양을 정의하는 데 사용됩니다. PS2는 명령이 여러 줄에 걸쳐 있을 때 보조 프롬프트를 선언하는 데 사용됩니다.
  • SHELLOPTS: set 옵션으로 설정할 수 있는 쉘 옵션
  • UID: 현재 사용자의 UID.

셸 및 환경 변수 설정

셸 변수와 환경 변수의 차이점을 더 잘 이해하고 이러한 변수를 설정하는 구문을 소개하기 위해 간단한 데모를 수행할 것입니다.

쉘 변수 생성

현재 세션 내에서 쉘 변수를 정의하는 것으로 시작하겠습니다. 이것은 달성하기 쉽습니다. 이름과 값만 지정하면 됩니다. 변수 이름에 대한 모든 대문자를 유지하는 규칙을 준수하고 간단한 문자열로 설정합니다.

  1. TEST_VAR='Hello World!'

여기에서는 변수 값에 공백이 포함되어 있으므로 따옴표를 사용했습니다. 또한 작은따옴표를 사용했습니다. 느낌표는 bash 셸에서 이스케이프하거나 작은따옴표로 묶지 않으면 일반적으로 bash 기록으로 확장되는 특수 문자이기 때문입니다.

이제 쉘 변수가 생겼습니다. 이 변수는 현재 세션에서 사용할 수 있지만 하위 프로세스로 전달되지는 않습니다.

set 출력 내에서 새 변수에 대한 grepping을 통해 이를 확인할 수 있습니다.

  1. set | grep TEST_VAR
Output
TEST_VAR='Hello World!'

printenv로 동일한 작업을 시도하여 이것이 환경 변수가 아님을 확인할 수 있습니다.

  1. printenv | grep TEST_VAR

출력이 반환되지 않아야 합니다.

쉘 또는 환경 변수의 값에 액세스하는 방법을 시연할 수 있는 기회로 삼겠습니다.

  1. echo $TEST_VAR
Output
Hello World!

보시다시피 변수 앞에 $ 기호를 붙여서 변수 값을 참조하십시오. 쉘은 이를 발견하면 변수의 값을 대체해야 함을 의미합니다.

이제 쉘 변수가 생겼습니다. 하위 프로세스로 전달되어서는 안됩니다. 우리는 다음을 시연하기 위해 현재의 것에서 bash 셸을 생성할 수 있습니다.

  1. bash
  2. echo $TEST_VAR

자식 셸을 생성하기 위해 bash를 입력한 다음 변수의 내용에 액세스하려고 하면 아무 것도 반환되지 않습니다. 이것이 우리가 기대한 것입니다.

exit를 입력하여 원래 셸로 돌아갑니다.

  1. exit

환경 변수 생성

이제 쉘 변수를 환경 변수로 바꾸겠습니다. 변수를 내보내기하여 이를 수행할 수 있습니다. 이를 수행하는 명령의 이름은 다음과 같이 적절하게 지정됩니다.

  1. export TEST_VAR

이렇게 하면 변수가 환경 변수로 변경됩니다. 환경 목록을 다시 확인하여 이를 확인할 수 있습니다.

  1. printenv | grep TEST_VAR
Output
TEST_VAR=Hello World!

이번에는 변수가 나타납니다. 자식 셸로 다시 실험해 봅시다.

  1. bash
  2. echo $TEST_VAR
Output
Hello World!

엄청난! 우리 자식 셸은 부모가 설정한 변수를 받았습니다. 이 자식 셸을 종료하기 전에 다른 변수를 내보내 보겠습니다. 다음과 같이 단일 단계로 환경 변수를 설정할 수 있습니다.

  1. export NEW_VAR="Testing export"

환경 변수로 내보내졌는지 테스트합니다.

  1. printenv | grep NEW_VAR
Output
NEW_VAR=Testing export

이제 원래 셸로 돌아가겠습니다.

  1. exit

새 변수를 사용할 수 있는지 살펴보겠습니다.

  1. echo $NEW_VAR

아무것도 반환되지 않습니다.

이는 환경 변수가 하위 프로세스에만 전달되기 때문입니다. 상위 셸의 환경 변수를 설정하는 기본 제공 방법이 없습니다. 이것은 대부분의 경우에 유용하며 프로그램이 호출된 운영 환경에 영향을 주지 않도록 합니다.

NEW_VAR 변수는 자식 셸에서 환경 변수로 설정되었습니다. 이 변수는 자신과 하위 셸 및 프로세스에서 사용할 수 있습니다. 메인 쉘로 다시 빠져나왔을 때 해당 환경이 파괴되었습니다.

변수 강등 및 설정 해제

우리는 여전히 TEST_VAR 변수를 환경 변수로 정의했습니다. 다음을 입력하여 다시 쉘 변수로 변경할 수 있습니다.

  1. export -n TEST_VAR

더 이상 환경 변수가 아닙니다.

  1. printenv | grep TEST_VAR

그러나 여전히 쉘 변수입니다.

  1. set | grep TEST_VAR
Output
TEST_VAR='Hello World!'

셸 또는 환경 변수를 완전히 해제하려면 unset 명령을 사용하면 됩니다.

  1. unset TEST_VAR

더 이상 설정되지 않았는지 확인할 수 있습니다.

  1. echo $TEST_VAR

변수가 설정되지 않았기 때문에 아무 것도 반환되지 않습니다.

로그인 시 환경 변수 설정

우리는 이미 많은 프로그램이 환경 변수를 사용하여 운영 방법의 세부 사항을 결정한다고 언급했습니다. 새 셸 세션을 시작할 때마다 중요한 변수를 설정하고 싶지 않고 로그인 시 이미 얼마나 많은 변수가 설정되어 있는지 확인했습니다. 그렇다면 변수를 자동으로 만들고 정의하는 방법은 무엇입니까?

bash 쉘이 시작되는 방법에 따라 읽는 수많은 구성 파일로 인해 이것은 실제로 처음에 보이는 것보다 더 복잡한 문제입니다.

로그인, 비로그인, 대화형 및 비대화형 셸 세션의 차이점

bash 셸은 세션 시작 방법에 따라 다른 구성 파일을 읽습니다.

서로 다른 세션 간의 한 가지 차이점은 쉘이 로그인 또는 비로그인 세션으로 생성되는지 여부입니다.

로그인 쉘은 사용자 인증으로 시작되는 쉘 세션입니다. 터미널 세션에 로그인하거나 SSH를 통해 인증하는 경우 셸 세션이 로그인 셸로 설정됩니다.

터미널에서 bash 명령을 호출하여 수행한 것처럼 인증된 세션 내에서 새 셸 세션을 시작하면 비로그인 셸 세션이 시작됩니다. 자식 셸을 시작할 때 인증 세부 정보를 요청하지 않았습니다.

만들 수 있는 또 다른 구분은 셸 세션이 대화형인지 비대화형인지 여부입니다.

대화형 셸 세션은 터미널에 연결된 셸 세션입니다. 비대화식 셸 세션은 터미널 세션에 연결되지 않은 세션입니다.

따라서 각 셸 세션은 로그인 또는 비로그인과 대화형 또는 비대화형으로 분류됩니다.

SSH로 시작하는 일반 세션은 일반적으로 대화형 로그인 셸입니다. 명령줄에서 실행되는 스크립트는 일반적으로 비대화형 비로그인 셸에서 실행됩니다. 터미널 세션은 이 두 속성의 조합일 수 있습니다.

쉘 세션이 로그인 또는 비로그인 쉘로 분류되는지 여부는 쉘 세션을 초기화하기 위해 어떤 파일을 읽어야 하는지에 영향을 미칩니다.

로그인 세션으로 시작된 세션은 먼저 /etc/profile 파일에서 구성 세부 정보를 읽습니다. 그런 다음 사용자별 구성 세부 정보를 얻기 위해 사용자의 홈 디렉터리에서 첫 번째 로그인 셸 구성 파일을 찾습니다.

~/.bash_profile, ~/.bash_login~/.profile에서 찾을 수 있는 첫 번째 파일을 읽고 읽지 않습니다. 추가 파일을 읽습니다.

반대로 비 로그인 셸로 정의된 세션은 /etc/bash.bashrc를 읽은 다음 사용자별 ~/.bashrc 파일을 읽어 환경을 구축합니다.

비대화형 쉘은 BASH_ENV라는 환경 변수를 읽고 지정된 파일을 읽어 새 환경을 정의합니다.

환경 변수 구현

보시다시피 설정을 배치하기 위해 일반적으로 살펴봐야 하는 다양한 파일이 있습니다.

이것은 로그인 셸에서 특정 설정을 원하고 비로그인 셸에서 다른 설정을 원하는 특정 상황에서 도움이 될 수 있는 많은 유연성을 제공합니다. 그러나 대부분의 경우 두 상황에서 동일한 설정을 원할 것입니다.

다행스럽게도 대부분의 Linux 배포판은 비로그인 구성 파일을 소싱하도록 로그인 구성 파일을 구성합니다. 이는 비로그인 구성 파일 내부에서 원하는 환경 변수를 정의할 수 있음을 의미합니다. 그런 다음 두 시나리오 모두에서 읽힙니다.

우리는 일반적으로 사용자별 환경 변수를 설정하고 일반적으로 로그인 및 비로그인 셸 모두에서 설정을 사용할 수 있기를 원합니다. 이는 이러한 변수를 정의할 위치가 ~/.bashrc 파일에 있음을 의미합니다.

지금 이 파일 열기:

  1. nano ~/.bashrc

여기에는 이미 꽤 많은 데이터가 포함되어 있을 가능성이 큽니다. 여기에 있는 대부분의 정의는 환경 변수와 관련이 없는 bash 옵션을 설정하기 위한 것입니다. 명령줄에서와 마찬가지로 환경 변수를 설정할 수 있습니다.

  1. export VARNAME=value

새로운 환경 변수는 다른 명령 또는 for 루프의 중간에 배치되지 않는 한 ~/.bashrc 파일의 아무 곳에나 추가할 수 있습니다. 그런 다음 파일을 저장하고 닫을 수 있습니다. 다음에 쉘 세션을 시작할 때 환경 변수 선언을 읽고 쉘 환경으로 전달합니다. 다음을 입력하여 현재 세션에서 파일을 읽도록 할 수 있습니다.

  1. source ~/.bashrc

시스템 전체 변수를 설정해야 하는 경우 /etc/profile, /etc/bash.bashrc 또는 /에 추가하는 것을 고려할 수 있습니다. 등/환경.

결론

환경 및 쉘 변수는 항상 쉘 세션에 존재하며 매우 유용할 수 있습니다. 부모 프로세스가 자식에 대한 구성 세부 정보를 설정하는 흥미로운 방법이며 파일 외부에서 옵션을 설정하는 방법입니다.

이는 특정 상황에서 많은 이점이 있습니다. 예를 들어 일부 배포 메커니즘은 인증 정보를 구성하기 위해 환경 변수에 의존합니다. 이는 외부에서 볼 수 있는 파일에 보관할 필요가 없기 때문에 유용합니다.

시스템 환경을 읽거나 변경해야 하는 더 평범하지만 더 일반적인 다른 시나리오가 많이 있습니다. 이러한 도구와 기술은 이러한 변경을 수행하고 올바르게 사용하기 위한 좋은 기반을 제공해야 합니다.