M. 가렐스. 배쉬 가이드. 변수. Linux에서 로컬, 사용자 및 시스템 환경 변수를 설정 및 비활성화하는 방법 쉘 변수가 작성된 위치를 찾는 방법

변수 유형

위의 예에서 볼 수 있듯이 쉘 변수는 일반적으로 대문자로 작성됩니다. Bash는 두 가지 유형의 변수 목록을 저장합니다.

전역 변수

전역 또는 환경 변수는 모든 셸에서 사용할 수 있습니다. 환경 변수를 표시하려면 다음 명령을 사용할 수 있습니다. 환경또는 printenv. 이 명령은 패키지의 일부로 제공됩니다. sh-utils.

다음은 일반적인 출력입니다.

Franky ~> printenv CC=gcc CDPATH=.:~:/usr/local:/usr:/ CFLAGS=-O2 -fomit-frame-pointer COLORTERM=gnome-terminal CXXFLAGS=-O2 -fomit-frame-pointer DISPLAY=: 0 DOMAIN=hq.garrels.be e= TOR=vi FCEDIT=vi FIGNORE=.o:~ G_BROKEN_FILENAMES=1 GDK_USE_XFT=1 GDMSESSION=기본값 GNOME_DESKTOP_SESSION_ID=기본값 GTK_RC_FILES=/etc/gtk/gtkrc:/nethome/franky/.gtkrc -1.2-gnome2 GWMCOLOR=darkgreen GWMTERM=xterm HISTFILESIZE=5000 History_control=ignoredups HISTSIZE=2000 HOME=/nethome/franky HOSTNAME=octarine.hq.garrels.be INPUTRC=/etc/inputrc IRCNAME=franky JAVA_HOME=/usr/java/ j2sdk1.4.0 LANG=en_US LDFLAGS=-s LD_LIBRARY_PATH=/usr/lib/mozilla:/usr/lib/mozilla/plugins LESSCHARSET=latin1 LESS=-edfMQ LESSOPEN=|/usr/bin/lesspipe.sh %s LEX=flex LOCAL_MACHINE=옥타린 LOGNAME=프랭키 LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd= 40;33;01:또는=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*. com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz= 01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01; 31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31: *.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*. tif=01;35: MACHINES=옥타린 MAILCHECK=60 MAIL=/var/mail/franky MANPATH=/usr/man:/usr/share/man/:/usr/local/man:/usr/X11R6/man MEAN_MACHINES= 옥타린 MOZ_DIST_BIN=/usr/lib/mozilla MOZILLA_FIVE_HOME=/usr/lib/mozilla MOZ_PROGRAM=/usr/lib/mozilla/mozilla-bin MTOOLS_FAT_COMPATIBILITY=1 MYMALLOC=0 NNTPPORT=119 NNTPSERVER=뉴스 NPX_PLUGIN_PATH=/plugin/ns 4plugin/: / usr/lib/netscape/plugins OLDPWD=/nethome/franky OS=Linux PAGER=적은 경로=/nethome/franky/bin.Linux:/nethome/franky/bin:/usr/local/bin:/usr/local/ sbin:/usr/X11R6/bin:/usr/bin:/usr/sbin:/bin:/sbin:. PS1=\[\033franky는 \w\[\033 PS2=추가 입력> PWD=/nethome/franky SESSION_MANAGER=local/octarine.hq.garrels.be:/tmp/.ICE-unix/22106 SHELL=/bin에 있습니다. /bash SHELL_LOGIN=--로그인 SHLVL=2 SSH_AGENT_PID=22161 SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass SSH_AUTH_SOCK=/tmp/ssh-XXmhQ4fC/agent.22106 START_WM=twm TERM=xterm TYPE=유형 USERNAME= Franky USER=franky _=/usr/bin/printenv VISUAL=vi WINDOWID=20971661 XAPPLRESDIR=/nethome/franky/app-defaults XAUTHORITY=/nethome/franky/.Xauthority XENVIRONMENT=/nethome/franky/.Xdefaults XFILESEARCHPATH=/usr /X11R6/lib/X11/%L/%T/%N%C%S:/usr/X11R6/lib/X11/%l/%T/%N%C%S:/usr/X11R6/lib/X11 /%T/%N%C%S:/usr/X11R6/lib/X11/%L/%T/%N%S:/usr/X11R6/lib/X11/%l/%T/%N%S :/usr/X11R6/lib/X11/%T/%N%S XKEYSYMDB=/usr/X11R6/lib/X11/XKeysymDB XMODIFIERS=@im=none XTERMID= XWINHOME=/usr/X11R6 X=X11R6 YACC=bison - 와이

지역변수

지역 변수는 현재 명령 셸에서만 사용할 수 있습니다. 내장 명령인 경우 세트매개변수 없이 사용되면 모든 변수(런타임 변수 포함) 및 함수 목록이 반환됩니다. 서식을 사용하여 변수의 지역성을 고려한 정렬된 결과를 생성해 보겠습니다.

아래는 명령의 결과를 비교하여 생성된 diff 파일입니다. printenv그리고 세트, 명령으로 표시되는 기능 목록에서 제거한 후 세트:

프랭키 ~> diff set.sorted printenv.sorted | 그렙 "<" | awk "{ print $2 }" BASE=/nethome/franky/.Shell/hq.garrels.be/octarine.aliases BASH=/bin/bash BASH_VERSINFO=(="2" BASH_VERSION="2.05b.0(1)-release" COLUMNS=80 DIRSTACK=() DO_FORTUNE= EUID=504 GROUPS=() HERE=/home/franky HISTFILE=/nethome/franky/.bash_history HOSTTYPE=i686 IFS=$" LINES=24 MACHTYPE=i686-pc-linux-gnu OPTERR=1 OPTIND=1 OSTYPE=linux-gnu PIPESTATUS=(="0") PPID=10099 PS4="+ PWD_REAL="pwd SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor THERE=/home/franky UID=504

변수를 내용으로 나누기

변수를 로컬과 전역으로 나누는 것 외에도 변수에 저장되는 내용에 따라 카테고리로 나눌 수도 있습니다. 이와 관련하여 변수는 네 가지 유형으로 나뉩니다.

  • 문자열 변수
  • 정수변수
  • 변수 - 상수
  • 변수 - 배열

이러한 유형의 변수는 10장에서 논의하겠습니다. 이제 변수에 정수와 문자열 값을 사용하겠습니다.

변수 생성

변수에서는 대문자와 소문자를 구분하며 기본적으로 대문자를 사용합니다. 때로는 지역 변수를 작성하기 위해 소문자를 사용하는 것이 관례입니다. 그러나 변수 이름에는 모든 문자를 사용할 수 있으며 대문자와 소문자를 혼합할 수도 있습니다. 변수 이름에 숫자를 사용할 수도 있지만 숫자로 시작하는 이름은 허용되지 않습니다.

프롬프트> 내보내기 1번호=1 bash: 내보내기: `1번호=1": 유효한 식별자가 아닙니다.

명령 셸에서 변수를 설정하려면 다음 명령을 사용합니다.

VARNAME="값"

등호 주위에 공백을 삽입하지 마십시오. 이로 인해 오류가 발생합니다. 변수에 값을 할당할 때 문자열의 내용을 따옴표로 묶는 것이 좋은 습관입니다. 이렇게 하면 실수할 가능성이 줄어듭니다.

대문자와 소문자, 숫자 및 공백을 사용하는 몇 가지 예(명령어를 찾을 수 없음 메시지는 문제가 있음을 나타냄) 대략.):

프랭키 ~> MYVAR1="2" 프랭키 ~> echo $MYVAR1 2 프랭키 ~> first_name="Franky" 프랭키 ~> echo $first_name 프랭키 프랭키 ~> full_name="Franky M. Singh" 프랭키 ~> echo $full_name 프랭키 M. Singh Franky ~> MYVAR-2="2" bash: MYVAR-2=2: 명령을 찾을 수 없음 Franky ~> MYVAR1 ="2" bash: MYVAR1: 명령을 찾을 수 없음 Franky ~> MYVAR1= "2" bash: 2: 명령 찾을 수 없음 Franky ~> MYVAR1 설정 해제 first_name full_name Franky ~> echo $MYVAR1 $first_name $full_name<--no output-->프랑키 ~>

변수 내보내기

위의 예와 같이 생성된 변수는 현재 명령 셸에서만 사용할 수 있습니다. 이것은 지역 변수입니다. 현재 쉘의 하위 프로세스는 이 변수를 인식하지 못합니다. 변수를 서브쉘에 전달하려면 다음이 필요합니다. 내보내다내장 명령을 사용하여 내보내다. 내보낸 변수를 환경 변수라고 합니다. 값 할당 및 내보내기는 일반적으로 한 단계로 수행됩니다.

VARNAME="값" 내보내기

서브쉘은 상위 프로세스에서 상속된 변수를 변경할 수 있지만 하위 프로세스의 변경 사항은 상위 프로세스에 영향을 주지 않습니다. 이는 다음 예에서 설명됩니다.

Franky ~> full_name="Franky M. Singh" Franky ~> bash Franky ~> echo $full_name Franky ~> Exit Franky ~> 내보내기 full_name Franky ~> bash Franky ~> echo $full_name Franky M. Singh Franky ~> 내보내기 full_name= "Charles the Great" Franky ~> echo $full_name Charles the Great Franky ~> Exit Franky ~> echo $full_name Franky M. Singh Franky ~>

서브쉘이 처음으로 full_name 값을 읽으려고 시도하면 값이 설정되지 않습니다(명령 에코빈 줄이 표시됩니다). 하위 쉘이 종료된 후 full_name 변수가 상위 쉘로 내보내집니다. 변수에 값이 할당된 후에 내보낼 수 있습니다. 그런 다음 새 하위 쉘이 시작되어 상위 쉘에서 내보낸 변수를 표시합니다. 변수가 수정되고 다른 값이 저장되지만 상위 셸에서는 이 변수의 값이 동일하게 유지됩니다.

예약된 변수

Bourne 예약 쉘 변수

Bash는 Bourne 쉘과 같은 특정 쉘 변수를 사용합니다. 어떤 경우에는 Bash가 변수에 기본값을 할당합니다. 아래 표는 다음과 같습니다. 간단한 설명다음과 같은 간단한 쉘 변수:

표 3.1. Bourne 예약 쉘 변수

변수 이름 정의

내장 명령을 사용하여 경로를 검색할 때 사용되는 콜론으로 구분된 디렉터리 목록 CD.

홈 디렉토리 현재 사용자; 내장 명령에서 기본적으로 사용됨 CD. 이 변수의 값은 물결표 문자 대신에도 사용됩니다.

필드를 구분하는 데 사용되는 문자 목록입니다. 쉘이 모든 대체를 수행한 후 결과를 개별 단어로 분할할 때 사용됩니다.

이 매개 변수가 파일 이름으로 설정되고 MAILPATH가 설정되지 않은 경우 Bash는 지정된 파일에서 메일이 수신되었음을 사용자에게 알립니다.

명령 셸이 정기적으로 새 메일을 확인하는 콜론으로 구분된 파일 이름 목록입니다.

내장 명령이 처리하는 매개변수의 마지막 인수 값 getopts.

내장 명령에 의해 처리된 마지막 매개변수 인수의 인덱스 getopts.

쉘이 명령을 찾는 디렉토리의 콜론으로 구분된 목록입니다.

기본 프롬프트 라인. 기본값은 ""\s-\v\$ ""입니다.

보조 프롬프트 라인. 기본값은 ""> ""입니다.

Bash 예약 변수

이러한 변수의 값은 Bash에서 설정되거나 사용되지만 일반적으로 다른 쉘에서는 특별하게 취급되지 않습니다.

표 3.2. Bash 예약 변수

변수 이름 정의

이 변수는 셸이 사용자와 상호 작용하고 작업을 수행하는 방법을 제어합니다.

현재 Bash 인스턴스를 시작하는 데 사용되는 전체 경로입니다.

Bash가 스크립트를 실행하기 위해 호출될 때 이 변수가 설정되면 해당 값은 스크립트가 실행되기 전에 읽어야 하는 시작 파일의 이름으로 사용됩니다.

현재 Bash 인스턴스의 버전 번호입니다.

변수는 배열 요소에 버전 정보가 저장되는 읽기 전용 배열입니다. 이 경우의세게 때리다.

선택한 목록을 인쇄할 때 내장된 명령이 사용됩니다. 선택하다터미널의 너비를 결정합니다. 신호 수신시 자동으로 설정 시그윈치.

현재 커서 위치를 저장하는 단어에 대한 $(COMP_WORDS)의 포인터입니다.

현재 명령줄.

현재 명령의 시작을 기준으로 현재 커서 위치에 대한 포인터입니다.

변수는 현재 명령줄에서 사용되는 개별 단어로 구성된 배열입니다.

변수는 Bash가 읽는 배열입니다. 가능한 옵션프로그램 완성을 위해 설계된 서비스에 의해 호출된 셸 함수에 의해 생성된 문자열 완성

변수는 디렉터리 스택의 현재 상태를 저장하는 배열입니다.

숫자 유효 사용자 ID 현재 사용자의 ID입니다.

내장 명령에서 사용되는 기본 편집기 FC-e 매개변수가 지정되었습니다.

자동 파일 이름 완성을 수행할 때 무시해야 하는 콜론으로 구분된 접미사 목록입니다.

현재 실행 중인 쉘 함수의 이름입니다.

파일 이름을 바꿀 때 무시할 파일 이름 집합을 정의하는 콜론으로 구분된 패턴 목록입니다.

변수는 현재 사용자가 속한 그룹 목록을 포함하는 배열입니다.

명령 내역 대체, 빠른 대체, 완료된 대체를 토큰으로 분할을 제어하는 ​​최대 3개의 문자입니다.

명령 기록에 있는 현재 명령의 번호 또는 명령 기록 목록에 있는 해당 인덱스입니다.

명령이 명령 기록 파일에 추가되는지 여부를 결정합니다.

명령 기록이 저장되는 파일 이름입니다. 기본값: ~/.bash_history.

명령 기록 파일에 포함된 기본 최대 행 수는 500입니다.

명령을 명령 기록 목록에 저장해야 하는지 여부를 결정하는 콜론으로 구분된 패턴 목록입니다.

명령 기록 목록에 저장할 수 있는 기본 최대 명령 수는 500개입니다.

명령 셸이 호스트 이름을 완성해야 할 때 읽을 수 있는 /etc/hosts 파일과 동일한 형식의 파일 이름을 포함합니다.

현재 호스트 이름.

Bash가 실행 중인 머신을 설명하는 문자열입니다.

입력 스트림의 종료 문자로 문자를 수신할 때 쉘이 수행하는 작업을 제어합니다. EOF(파일 끝 기호).

기본 /etc/inputrc 파일을 대체하는 Readline 프로그램 초기화 파일의 이름입니다.

이름이 LC_ 문자로 시작하는 변수에 의해 명시적으로 지정되지 않은 모든 범주에 대한 로케일 범주를 정의하는 데 사용됩니다.

이 변수는 LANG 변수의 값과 지역화 범주를 지정하는 LC_ 문자로 시작하는 다른 모든 변수를 재정의합니다.

이 변수는 패턴 일치 파일 이름을 정렬할 때 사용되는 정렬 순서를 지정하고 범위 해석, 일치 클래스, 파일 이름 대체 및 패턴 일치에 대한 문자 비교 규칙을 결정합니다.

이 변수는 문자가 해석되는 방식과 파일 이름 확장 및 패턴 일치를 위해 특정 클래스에 속하는지 여부를 결정합니다.

이 변수는 문자열을 처리하는 데 사용되는 지역화 범주를 지정합니다. 큰따옴표, 앞에 $ 기호가 붙습니다.

이 변수는 숫자 형식의 지역화 범주를 지정합니다.

현재 실행 중인 스크립트 또는 셸 함수의 줄 번호입니다.

내장 명령에 의해 사용됨 선택하다선택한 목록이 표시되는 열의 길이를 결정합니다.

표준 GNU CPU-COMPANY-SYSTEM 형식을 사용하여 Bash가 실행 중인 시스템 유형을 완전히 설명하는 문자열입니다.

MAILPATH 또는 MAIL 변수에 지정된 파일에서 쉘이 메일을 확인해야 하는 빈도를 초 단위로 지정합니다.

내장 명령을 사용하여 이전 작업 디렉터리 설정 CD.

1로 설정하면 Bash는 내장 명령으로 생성된 오류 메시지를 표시합니다. getopts.

문자열 설명 운영 체제, Bash를 실행합니다.

변수는 마지막 파이프라인(단일 명령으로 구성될 수 있음)의 프로세스 종료 상태 값 목록을 포함하는 배열입니다.

Bash가 시작될 때 이 변수가 환경에 추가되면 쉘은 POSIX 모드로 전환됩니다.

이 변수가 설정되면 값은 각 기본 프롬프트 라인(PS1)이 실행되기 전에 실행되는 명령으로 해석됩니다.

이 변수의 값은 명령에 사용됩니다. 선택하다프롬프트 문자열로. 기본 - ""#? ""

-x 옵션이 에코를 활성화하도록 설정된 경우 명령줄 이전에 실행되는 프롬프트 문자열의 값 명령줄; 기본값은 ""+ ""입니다.

내장 명령으로 설정된 현재 작업 디렉토리 CD.

이 매개변수에 접근할 때마다 0~32767 범위의 임의의 정수가 생성됩니다. 이 변수의 값은 난수 생성기에 사용됩니다.

내장 명령의 기본 변수 읽다.

이 변수는 명령 셸이 시작된 이후 경과한 시간(초)을 나타냅니다.

명령 셸에 설정된 매개변수 목록입니다. 콜론으로 구분됩니다.

새로운 Bash 인스턴스가 시작될 때마다 1씩 증가합니다.

이 매개변수의 값은 앞에 예약어가 있는 파이프라인에 대한 런타임 정보를 발행하기 위한 형식을 지정하는 문자열로 사용됩니다. 시간.

TMOUT 변수가 0보다 큰 값으로 설정되면 내장 명령에서 기본 시간 초과로 처리됩니다. 읽다. 명령 쉘이 대화식 모드에서 시작되면 이 값은 쉘이 초기 프롬프트 행을 발행한 후 입력을 기다리는 시간(초)으로 해석됩니다. 입력이 수신되지 않으면 이 시간 이후 Bash가 종료됩니다.

숫자값, 현재 사용자의 실제 사용자 ID입니다.

자세한 내용은 Bash 매뉴얼 페이지나 설명서를 참조하세요. 일부 변수는 읽기 전용이고 일부는 자동으로 설정되며 일부는 기본값이 아닌 다른 값으로 설정되면 의미가 없게 됩니다.

특수 매개변수

명령 쉘은 일부 매개변수를 특별한 방식으로 처리합니다. 이러한 매개변수는 해당 매개변수에서 값을 얻는 데만 사용할 수 있으며 값을 할당할 수는 없습니다.

표 3.3. Bash 특수 변수

상징 정의

첫 번째 매개변수부터 시작하는 위치 매개변수를 반환합니다. 매개변수가 큰따옴표로 지정되면 IFS 특수 변수의 첫 번째 문자로 구분된 각 매개변수의 값을 포함하는 단일 단어로 대체됩니다.

첫 번째 매개변수부터 시작하는 위치 매개변수를 반환합니다. 매개변수가 큰따옴표로 지정되면 각 매개변수는 별도의 단어로 반환됩니다.

지정된 위치 매개변수의 수를 10진수 값으로 반환합니다.

포그라운드 모드에서 실행된 마지막 파이프라인의 반환 코드를 반환합니다.

하이픈 매개변수는 내장 명령이 호출될 때 설정된 대로 현재 매개변수의 플래그를 반환합니다. 세트, 또는 쉘 자체에 의해 설정된 대로(예: -i).

쉘 프로세스 ID를 반환합니다.

백그라운드(비동기) 모드에서 실행된 마지막 명령의 프로세스 ID를 반환합니다.

쉘이나 스크립트의 이름을 반환합니다.

"밑줄" 매개변수의 값은 명령 셸이 시작될 때 설정되며 다음을 포함합니다. 성명인수 목록에 전달된 대로 실행되는 셸 또는 스크립트입니다. 그러면 값은 이전 명령의 마지막 인수로 대체됩니다. 또한 이 매개변수는 실행되고 해당 명령으로 내보낸 환경에 배치된 각 명령에 대한 전체 경로를 지정합니다. 메일을 확인할 때 이 매개변수에는 메일 파일의 이름이 포함됩니다.

위치 매개변수는 쉘 스크립트 이름 뒤에 오는 단어입니다. $1, $2, $3 등의 변수에 저장됩니다. 필요에 따라 변수가 내부 배열에 추가됩니다. $# 변수는 다음의 간단한 스크립트에 표시된 대로 총 매개변수 수를 지정합니다.

# positional.sh # 이 스크립트는 3개의 위치 매개변수를 읽고 인쇄합니다. POSPAR1="$1" POSPAR2="$2" POSPAR3="$3" echo "$1은 첫 번째 위치 매개변수 \$1입니다." echo "$2는 두 번째 위치 매개변수 \$2입니다." echo "$3은 세 번째 위치 매개변수 \$3입니다." echo echo "위치 매개변수의 총 개수는 $#입니다."

스크립트를 실행할 때 인수를 원하는 만큼 지정할 수 있습니다.

Franky ~> positional.sh one two three four five one은 첫 번째 위치 매개변수 $1입니다. two는 두 번째 위치 매개변수인 $2입니다. three는 세 번째 위치 매개변수인 $3입니다. 위치 매개변수의 총 개수는 5개입니다. Franky ~> positional.sh one two one은 첫 번째 위치 매개변수 $1입니다. two는 두 번째 위치 매개변수인 $2입니다. 세 번째 위치 매개변수 $3입니다. 위치 매개변수의 총 개수는 2개입니다.

이러한 매개변수 사용에 대한 자세한 내용은 7장 조건문 및 Shift 내장 명령 섹션을 참조하세요.

기타 특수 매개변수의 몇 가지 예:

Franky ~> grep Dictionary /usr/share/dict/words Dictionary Franky ~> echo $_ /usr/share/dict/words Franky ~> echo $$ 10662 Franky ~> mozilla & 11064 Franky ~> echo $! 11064 프랭키 ~> 에코 $0 bash 프랭키 ~> 에코 $? 0 Franky ~> ls doesnotexist ls: doesnotexist: 해당 파일이나 디렉토리가 없습니다 Franky ~> echo $? 프랑키 1개 ~>

사용자 프랑키명령을 입력하여 시작됩니다. grep, 변수 _ 에 값을 할당합니다. 이 쉘의 프로세스 ID는 10662입니다. 일부 작업의 실행이 다음으로 전송되는 경우 배경 모드, 변수에! 프로세스 식별자가 있습니다 백그라운드 작업. 작동하는 명령 셸은 다음과 같습니다. 세게 때리다. 오류가 발생했다면 변수에? 0(영)이 아닌 반환 코드가 발생합니다.

변수가 있는 스크립트의 적용 범위 확대

변수는 스크립트를 더 읽기 쉽게 만드는 것 외에도 다른 컨텍스트나 다른 목적으로 스크립트를 빠르게 사용하는 데 도움이 될 수 있습니다. 다음 예를 고려하십시오 - 원격 서버에서 수행되는 매우 간단한 스크립트 백업 복사본사용자의 홈 디렉토리 프랑키:

#!/bin/bash # 이 스크립트는 내 홈 디렉토리를 백업합니다. cd /home # 이렇게 하면 tar 아카이브가 생성됩니다. cf /var/tmp/home_franky.tar Franky > /dev/null 2>&1 # 먼저 이전 bzip2 파일을 제거합니다. 아카이브 #이 존재하지 않는 경우 일부 오류가 생성되므로 오류를 리디렉션합니다. 그런 다음 새 압축 파일을 만듭니다. rm /var/tmp/home_franky.tar.bz2 2> /dev/null bzip2 /var/tmp/home_franky.tar # 파일을 다른 호스트에 복사합니다. 개입 없이 이 작업을 수행할 수 있는 SSH 키가 있습니다. scp /var/tmp/home_franky.tar.bz2 bordeaux:/opt/backup/franky > /dev/null 2>&1 # 로그 파일에 타임스탬프를 만듭니다. 날짜 >> /home/franky/log/home_backup.log 에코 백업 성공 >> /home/franky/log/home_backup.log

우선, 필요할 때마다 파일과 디렉터리를 수동으로 지정하면 실수할 가능성이 더 높습니다. 둘째, 사용자를 가정해보자 프랑키이 스크립트를 사용자에게 전달하고 싶습니다 축가, 그럼 그 전에 축가스크립트를 사용할 수 있습니다. 예약 사본그의 홈 디렉토리를 꽤 많이 편집해야 할 것입니다. 사용자가 다음과 같은 경우에도 동일한 일이 발생합니다. 프랑키이 스크립트를 사용하여 다른 디렉터리를 백업하려고 합니다. 범위를 확장하려면 모든 파일, 디렉터리, 사용자 이름, 서버 이름 등에 대한 변수를 사용하세요. 그러면 값을 한 번만 변경하면 되며 특정 매개변수가 발생하는 모든 위치를 찾기 위해 전체 스크립트를 살펴볼 필요가 없습니다. 예:

#!/bin/bash # 이 스크립트는 내 홈 디렉토리를 백업합니다. # 스크립트가 작동하도록 변수 값을 변경합니다: BACKUPDIR=/home BACKUPFILES=franky TARFILE=/var/tmp/home_franky.tar BZIPFILE=/var/tmp/home_franky.tar.bz2 SERVER=bordeaux REMOTEDIR =/ opt/backup/franky LOGFILE=/home/franky/log/home_backup.log cd $BACKUPDIR # 이렇게 하면 tar 아카이브가 생성됩니다. cf $TARFILE $BACKUPFILES > /dev/null 2>&1 # 먼저 이전 bzip2 파일을 제거합니다. 아카이브 #이 존재하지 않는 경우 일부 오류가 생성되므로 오류를 리디렉션합니다. 그런 다음 새 압축 파일을 만듭니다. rm $BZIPFILE 2> /dev/null bzip2 $TARFILE # 파일을 다른 호스트에 복사합니다. 개입 없이 이 작업을 수행할 수 있는 SSH 키가 있습니다. scp $BZIPFILE $SERVER:$REMOTEDIR > /dev/null 2>&1 # 로그 파일에 타임스탬프를 만듭니다. 날짜 >> $LOGFILE 에코 백업 성공 >> $LOGFILE

서버로 작업하는 동안 셸은 서버의 동작과 리소스에 대한 액세스를 결정하는 많은 양의 정보를 컴파일합니다. 이러한 옵션 중 일부는 셸 설정에 있고 다른 옵션은 사용자 입력에 따라 결정됩니다.

쉘이 이 정보를 추적하는 한 가지 방법은 환경을 통하는 것입니다. 환경은 세션이 시작될 때마다 쉘이 구축하는 시스템 정의 변수를 포함하는 영역입니다.

이 튜토리얼에서는 환경과 상호 작용하고 환경 및 셸 변수를 대화식으로 읽거나 설정하는 방법을 설명합니다. 구성 파일. 모든 작업은 Ubuntu 12.04 VPS에서 수행되지만 최신 리눅스 배포판같은 방식으로 작동해야합니다.

환경과 해당 변수의 작동 방식

셸 세션이 활성화될 때마다 프로세스가 시작되어 셸과 해당 하위 프로세스에서 사용할 수 있는 정보를 수집하고 컴파일합니다. 셸은 시스템의 다양한 파일과 설정에서 이 데이터를 가져옵니다.

일반적으로 환경에서는 필요한 설정을 셸 프로세스에 수집하고 설정한 다음 해당 설정을 하위 프로세스에 전달하는 전송 기능을 제공합니다.

환경은 키-값 쌍을 포함하는 문자열 형식을 취합니다. 여러 값은 일반적으로 콜론(:)으로 구분됩니다. 각 쌍은 일반적으로 다음과 같습니다.

키=값1:값2:...

값에 공백이 포함된 경우 큰따옴표를 사용해야 합니다.

KEY="공백이 있는 값"

이 경우 키는 둘 중 하나의 변수를 의미합니다. 기존 종: 환경 또는 쉘 변수.

환경 변수현재 쉘에 대해 정의되었으며 모든 하위 쉘 또는 프로세스에 의해 상속되는 변수입니다. 환경 변수는 셸에서 시작된 프로세스에 정보를 전달하는 데 사용됩니다.

쉘 변수변수는 해당 변수가 설정되거나 정의된 쉘에만 포함되어 있습니다. 현재 데이터(예: 현재 작업 디렉터리)를 추적하는 데 자주 사용됩니다.

일반적으로 이러한 변수는 대문자로 표시됩니다. 이는 사용자가 다른 컨텍스트의 환경 변수를 구별하는 데 도움이 됩니다.

셸 및 환경 변수 인쇄

각 세션은 자체 쉘 및 환경 변수를 추적합니다. 그것들을 꺼내는 방법에는 여러 가지가 있습니다.

모든 환경 변수 목록을 보려면 env 또는 printenv 명령을 사용하십시오. 기본적으로 그들은 정확히 동일한 결과를 출력합니다:

printenv
쉘=/bin/bash
TERM=xterm
사용자=데마우저
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:또는=40;31;01:su=37;41:sg=30;43:ca:...
메일=/var/mail/demouser
경로=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
PWD=/집/demouser
LANG=en_US.UTF-8
SHLVL=1
HOME=/집/데마우저
LOGNAME=데마우저
덜 열려=| /usr/bin/lesspipe %s
LESSCLOSE=/usr/bin/lesspipe %s %s
_=/usr/bin/printenv

이는 printenv 및 env 명령 출력의 일반적인 예입니다. 이러한 명령은 몇 가지 개별 기능에서만 다릅니다. 예를 들어 printenv는 개별 변수의 값을 쿼리할 수 있습니다.

printenv 쉘
/bin/bash

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

env VAR1="어쩌구" command_to_run command_options

위에서 설명한 대로 하위 프로세스는 일반적으로 상위 프로세스의 환경 변수를 상속하므로 하위 프로세스에 대한 값을 변경하거나 추가 변수를 도입하는 것이 가능합니다.

printenv 명령의 출력에서 ​​볼 수 있듯이 다음을 사용하여 많은 환경 변수가 생성됩니다. 시스템 파일사용자 개입 없이 프로세스를 수행합니다.

하지만 쉘 변수를 어떻게 봅니까?

이렇게 하려면 set 명령을 사용하십시오. 추가 매개변수 없이 입력하면 set은 모든 셸 변수, 환경 변수, 지역 변수 및 셸 함수를 나열합니다.

세트
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=()
. . .

일반적으로 이 목록은 꽤 깁니다. 보다 편리한 형식으로 표시하려면 호출기 프로그램을 사용하여 엽니다.

이 목록에는 엄청난 숫자가 포함되어 있습니다. 추가 정보, 이는 이 순간필요하지 않습니다(예: 일부 bash 기능).

출력을 "정리"하려면 셸 기능을 우회하는 POSIX 모드에서 set 명령을 실행해야 합니다. 현재 환경을 변경하지 않으려면 이 작업을 서브셸에서 수행해야 합니다.

(설정 -o posix; 설정)

이 작업을 수행하면 모든 환경 및 셸 변수가 표시됩니다.

이 출력을 env/printenv 명령의 출력과 비교하고 셸 변수만 나열하려고 시도할 수도 있지만 이러한 명령의 출력이 다르기 때문에 이러한 목록은 이상적이지 않습니다.

통신 -23<(set -o posix; set | sort) <(env | sort)

set 명령은 값을 따옴표로 묶어서 인쇄하지만 printenv 및 env 명령은 그렇지 않기 때문에 목록에는 여러 환경 변수가 포함될 가능성이 높습니다.

그러나 이는 특정 세션에 설정된 환경 및 셸 변수를 볼 수 있는 좋은 방법입니다.

이러한 변수는 모든 종류의 목적으로 사용됩니다. 프로세스 간 세션에 대한 영구 값을 설정하는 대체 방법을 제공하므로 파일을 변경할 필요가 없습니다.

기본 환경 및 쉘 변수

특히 유용한 환경 및 쉘 변수가 매우 자주 사용됩니다.

다음은 주요 환경 변수 목록입니다.

  • 껍데기: 입력된 명령을 해석하는 쉘에 대해 설명합니다. 대부분의 경우 bash는 기본적으로 설치되지만 필요한 경우 이 값을 변경할 수 있습니다.
  • 용어: 쉘이 시작될 때 에뮬레이트되는 터미널 유형을 지정합니다. 작동 요구 사항에 따라 다양한 하드웨어 터미널을 에뮬레이션할 수 있습니다. 일반적으로 이에 대해 걱정할 필요가 없습니다.
  • 사용자: 현재 사용자.
  • P.W.D.: 현재 작업 디렉토리.
  • OLDPWD: 이전 작업 디렉토리. cd - 명령이 실행될 경우 쉘은 이를 저장합니다.
  • LS_그림 물감: ls 명령의 출력을 색상화하는 데 사용되는 색상 코드를 정의합니다. 이 출력은 사용자가 명령 결과를 더 빨리 읽는 데 도움이 됩니다(예: 파일 유형을 빠르게 구별함).
  • 우편: 사용자의 현재 편지함에 대한 경로입니다.
  • : 명령을 실행할 때 시스템이 액세스하는 디렉터리 목록입니다. 사용자가 명령을 실행하면 시스템은 실행 파일에 대해 지정된 순서로 이러한 디렉터리를 확인합니다.
  • : 문자 인코딩을 포함한 현재 언어 및 현지화 설정입니다.
  • : 현재 사용자의 홈 디렉터리입니다.
  • _ : 마지막 명령이 실행되었습니다.

환경 변수 목록을 검토한 후 셸 변수 목록을 검사합니다.

  • 바샵: bash를 실행할 때 사용되는 옵션 목록입니다. 이는 환경이 예상대로 작동하는지 확인하는 데 사용할 수 있습니다.
  • 세게 때리다_버전: 사람이 읽을 수 있는 형식으로 실행 중인 bash 버전입니다.
  • 세게 때리다_VERSINFO: 기계가 읽을 수 있는 bash 버전입니다.
  • : 열 단위로 출력 너비를 지정합니다.
  • 더스택: pushd 및 popd 명령에 액세스할 수 있는 디렉터리 스택입니다.
  • 히스트파일 크기: 명령 기록 파일에 포함된 최대 줄 수입니다.
  • 히스트사이즈: 히스토리 목록에 기억될 명령어의 개수입니다.
  • 호스트 이름: 현재 호스트 이름.
  • IFS:명령줄의 내부 입력 필드 구분 기호입니다. 기본값은 공간입니다.
  • PS1: 초기 프롬프트 라인(셸 세션을 시작할 때 명령줄 유형)을 정의합니다. PS2 변수는 명령이 여러 줄에 걸쳐 있는 경우 보조 프롬프트 줄을 설정합니다.
  • 조개: set을 사용하여 설정할 수 있는 쉘 옵션입니다.
  • UID: 현재 사용자의 고유 식별자입니다.

셸 및 환경 변수 설정

다음은 셸 변수와 환경 변수의 차이점을 보여주고 이러한 변수를 설정하는 구문을 설명하는 몇 가지 예입니다.

쉘 변수 생성

먼저 현재 세션에 대한 쉘 변수를 설정해야 합니다. 이 작업은 매우 간단하게 수행됩니다. 사용자가 해야 할 일은 이름과 값을 지정하는 것뿐입니다. 이미 언급했듯이 이러한 변수의 이름은 대문자를 사용합니다.

TEST_VAR="안녕하세요!"

이 예에서는 값에 공백이 포함되어 있으므로 따옴표를 사용합니다. 또한 느낌표는 이스케이프되거나 작은따옴표로 묶이지 않는 한 명령 기록에 액세스하는 bash 셸의 특수 문자이기 때문에 여기서 작은따옴표를 사용해야 합니다.

따라서 결과 쉘 변수는 현재 세션에서 유효하지만 하위 프로세스로 전달되지 않습니다.

이를 확인하려면 set 명령의 결과에 대해 grep 명령을 사용하십시오.

설정 | grep TEST_VAR
TEST_VAR="안녕하세요!"

printenv 명령의 결과에 대해 grep을 실행하여 이 변수가 환경 변수가 아닌지 확인할 수도 있습니다.

인쇄 환경 | grep TEST_VAR

이 작업은 어떤 결과도 생성하지 않습니다.

이는 쉘이나 환경 변수의 값을 노출하는 데 사용할 수 있습니다.

$TEST_VAR 에코
안녕하세요 월드!

보시다시피 변수 값에 접근하려면 $ 기호를 사용해야 합니다.

다시 말하지만, 결과 변수는 하위 프로세스에 전달되어서는 안 됩니다. 이를 테스트하려면 현재 셸 내에서 새 bash 셸을 배포하세요.

세게 때리다
$TEST_VAR 에코

하위 쉘을 확장하고 변수의 내용을 열려고 하면 아무 것도 인쇄되지 않습니다. 이는 모든 것이 제대로 작동하고 있음을 의미합니다.

원래 쉘로 돌아가려면 다음을 입력하십시오.

환경 변수 생성

이제 쉘 변수를 환경 변수로 바꿔보십시오. 이는 변수를 내보내서 수행됩니다. 내보내기를 수행하는 명령의 이름은 그에 따라 지정됩니다.

이 명령은 쉘 변수를 환경 변수로 바꿉니다. 모든 작업이 올바르게 수행되었는지 확인하려면 환경 변수 목록을 다시 살펴보세요.

인쇄 환경 | grep TEST_VAR
TEST_VAR=안녕하세요!

이제 이 변수가 이 목록에 표시됩니다. 하위 셸을 다시 확장할 수도 있습니다.

세게 때리다
$TEST_VAR 에코
안녕하세요 월드!

엄청난! 하위 쉘은 원래 쉘에서 변수를 받았습니다. 하위 셸을 떠나기 전에 변수를 하나 더 내보내보세요.

내보내기 NEW_VAR="내보내기 테스트 중"

변수가 내보내졌는지 확인합니다.

인쇄 환경 | grep NEW_VAR
NEW_VAR=내보내기 테스트 중

이제 원래 셸로 돌아갑니다.

이 변수를 열 수 있는지 확인하십시오.

결과가 반환되지 않습니다

이는 환경 변수가 하위 프로세스에만 전달되기 때문에 발생합니다. 상위 쉘의 환경 변수를 설정하는 기본 제공 방법은 없습니다. 대부분의 경우 이는 프로그램이 실행된 운영 환경을 방해하는 것을 방지합니다.

NEW_VAR 변수가 하위 쉘 환경 변수로 설정되었습니다. 이 변수는 이 쉘과 그 하위 쉘 및 프로세스에 유효합니다. 사용자가 원래 셸로 돌아온 후 이 환경은 파괴되었습니다.

변수 이동 및 재설정

TEST_VAR 변수는 여전히 환경 변수입니다. 다시 쉘 변수로 만들려면 다음을 입력하십시오.

내보내기 -n TEST_VAR

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

인쇄 환경 | grep TEST_VAR

이것은 다시 쉘 변수입니다:

설정 | grep TEST_VAR
TEST_VAR="안녕하세요!"

변수(환경 변수 또는 쉘 변수)를 완전히 재설정하려면 unset 명령을 사용하십시오.

해당 변수가 더 이상 존재하지 않는지 확인하십시오.

변수가 재설정되었기 때문에 결과가 인쇄되지 않았습니다.

환경 변수 자동 설정

이미 언급했듯이 많은 프로그램은 환경 변수를 사용하여 작동 방법을 결정합니다. 새로운 쉘을 생성할 때마다 필요한 변수를 설정하는 것은 상당히 불편합니다. 또한, 로그인 즉시 많은 변수가 설정됩니다. 변수를 자동으로 설정하는 방법은 무엇입니까?

Bash 쉘은 많은 구성 파일을 읽기 때문에 처음에 보이는 것보다 조금 더 복잡합니다.

셸 세션 유형

Bash 쉘은 세션이 시작된 방법에 따라 다른 구성 파일을 읽습니다. 쉘을 정의하는 처음 두 가지 세션 유형은 시작 및 하위 세션입니다.

스타터 또는 초기 쉘(로그인 쉘)은 사용자 인증 후 열리는 쉘 세션입니다. 사용자가 터미널에 로그인하거나 SSH를 사용하여 인증하면 시작 셸이 열립니다.

승인된(시작) 세션에서 새 세션이 시작되면(이전 예에서와 같이 새 bash 쉘이 시작됨) 이 세션은 자회사 (로그인껍데기). 이 세션을 열기 위해 인증 절차를 거칠 필요가 없습니다.

또한 셸 세션은 대화형이거나 비대화형일 수 있습니다.

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

따라서 쉘 세션은 시작-자식, 대화형-비대화형 측면에 따라 분류됩니다.

SSH를 사용하여 열리는 일반 세션은 일반적으로 대화형 시작 세션입니다. 명령줄을 통해 실행되는 스크립트는 일반적으로 비대화형 하위 세션에서 실행됩니다. 터미널 세션은 이 두 속성의 다른 조합입니다.

세션을 시작 세션 또는 하위 세션으로 분류함으로써 시스템은 셸 세션을 초기화하기 위해 읽어야 할 파일을 이해합니다.

따라서 먼저 시작 세션은 /etc/profile 파일에서 구성을 가져옵니다. 그런 다음 사용자 정의 구성을 얻기 위해 사용자의 홈 디렉토리에서 시작 셸 구성 파일을 찾습니다.

이 세션은 ~/.bash_profile, ~/.bash_login 및 ~/.profile 파일을 읽고 다른 파일은 읽지 않습니다.

하위 세션은 차례로 /etc/baash.bashrc를 읽은 다음 사용자의 ~/.bash.rc 파일을 읽어 환경을 배포합니다.

비대화형 쉘은 BASH_ENV 환경 변수와 지정된 파일을 읽어 새로운 환경을 생성합니다.

환경 변수를 설정하는 방법

보시다시피 구성은 여러 파일에 분산되어 있습니다.

이는 시스템을 매우 유연하게 만들어 시작 쉘과 하위 쉘에 대해 서로 다른 매개변수를 설정해야 하는 특정 상황에서 유용합니다. 그러나 이러한 쉘은 일반적으로 동일한 설정을 사용합니다.

다행히 대부분의 Linux 배포판은 시작 셸 구성의 소스로 하위 셸 구성 파일을 가리킵니다. 이는 하위 셸의 구성 파일에서 두 세션 모두에 대한 환경 변수를 정의할 수 있음을 의미합니다.

일반적으로 두 셸 모두 사용자 정의 환경 변수를 사용합니다. 이는 ~/.bashrc 파일에서 이러한 변수를 설정할 수 있음을 의미합니다.

이 파일을 엽니다:

아마도 이미 일부 데이터가 포함되어 있을 것입니다. 여기에 설정된 대부분의 값은 bash 옵션이며 환경 변수와는 아무런 관련이 없습니다. 이 파일의 변수는 명령줄에서와 정확히 동일한 방식으로 설정됩니다.

VARNAME=값 내보내기

필요한 변수를 모두 입력한 후 파일을 닫습니다. 다음에 쉘 세션을 시작할 때 여기에 설정된 변수를 읽고 쉘 환경으로 전달합니다. 현재 세션에 지정된 파일을 읽도록 지시하려면 다음을 입력하십시오.

소스 ~/.bashrc

시스템 전체 변수를 설정하려면 해당 변수를 /etc/profile, /etc/bash.bashrc 또는 /etc/environment에 추가하세요.

결과

셸 및 환경 변수는 항상 모든 셸 세션에 존재하므로 이를 사용하는 방법을 아는 것이 특히 유용합니다. 상위 프로세스 구성을 하위 프로세스에 전달하고 파일 외부에서 설정을 구성하는 데 사용할 수 있습니다.

이는 특정 상황에서 여러 가지 이점을 제공합니다. 예를 들어 일부 배포 메커니즘은 환경 변수를 사용하여 인증 정보를 구성합니다. 이렇게 중요한 데이터는 어떤 파일에도 저장되지 않아 외부인으로부터 안전하게 보호되기 때문에 편리합니다.

변수를 읽거나 시스템 환경을 변경해야 하는 더 일반적인 상황이 많이 있습니다. 이 가이드에 설명된 도구와 기술은 변수 작업 및 올바른 사용 기술을 개발하기 위한 탁월한 기반을 제공합니다.

태그: ,

Linux의 환경 변수는 셸에서 정의되고 런타임 시 프로그램에서 사용되는 특수 변수입니다. 시스템과 사용자가 정의할 수 있습니다. Linux 시스템 환경 변수는 시스템에 의해 정의되고 시스템 수준 프로그램에서 사용됩니다.

예를 들어, PWD 명령은 시스템 변수를 사용하여 이전 작업 디렉터리를 유지합니다. 사용자 환경 변수는 현재 셸에 대해 사용자가 일시적으로 또는 영구적으로 설정합니다. 셸 변수를 추가하고 제거하는 전체 개념은 여러 파일, 명령 및 다양한 셸을 중심으로 이루어집니다.

보다 광범위하게 환경 변수는 세 가지 유형이 될 수 있습니다.

1. 로컬 환경 변수

이러한 변수는 현재 세션에 대해서만 정의됩니다. 원격 액세스이든 터미널 에뮬레이터이든 세션이 끝나면 영구적으로 지워집니다. 어떤 파일에도 저장되지 않지만 특수 명령을 사용하여 생성 및 삭제됩니다.

2. 사용자 정의 쉘 변수

Linux의 이러한 셸 변수는 특정 사용자에 대해 정의되며 사용자가 로컬 터미널을 사용하여 로그인하거나 원격으로 연결할 때마다 로드됩니다. 이러한 변수는 일반적으로 구성 파일(.bashrc, .bash_profile, .bash_login, .profile 또는 사용자 디렉터리에 있는 기타 파일)에 저장됩니다.

3. 시스템 환경 변수

이러한 변수는 모든 사용자가 시스템 전체에서 사용할 수 있습니다. 시스템 시작 시 시스템 구성 파일인 /etc/environment, /etc/profile, /etc/profile.d/ /etc/bash.bashrc에서 로드됩니다.

Linux 환경 변수 구성 파일

여기서는 전체 시스템 또는 특정 사용자에 대한 환경 변수를 구성하는 데 사용되는 위에 나열된 다양한 구성 파일을 간략하게 살펴보겠습니다.

.bashrc

사용자별 변수 파일입니다. 사용자가 터미널 세션을 생성할 때마다, 즉 새 터미널을 열 때마다 로드됩니다. 이 파일에 생성된 모든 환경 변수는 새 터미널 세션이 시작될 때마다 적용됩니다.

.bash_profile

이러한 변수는 사용자가 SSH를 통해 원격으로 연결할 때마다 적용됩니다. 이 파일이 없으면 시스템은 .bash_login 또는 .profile을 찾습니다.

/etc/환경

이 파일은 시스템 수준에서 환경 변수를 생성, 편집 및 삭제하기 위한 것입니다. 이 파일에서 생성된 환경 변수는 전체 시스템, 각 사용자 및 원격 연결 시에도 사용할 수 있습니다.

/etc/bash.bashrc

시스템 bashrc. 이 파일은 각 사용자가 새 터미널 세션을 생성할 때마다 실행됩니다. 이는 로컬 사용자에게만 작동하며, 인터넷을 통해 연결된 경우 해당 변수는 표시되지 않습니다.

/etc/프로필

시스템 파일 프로필. 이 파일의 모든 변수는 원격으로 로그인한 경우에만 시스템의 모든 사용자가 사용할 수 있습니다. 그러나 로컬 터미널 세션을 생성할 때, 즉 단순히 터미널을 열면 사용할 수 없습니다.

이러한 파일을 사용하여 생성된 모든 Linux 환경 변수는 해당 파일을 삭제하여 간단히 제거할 수 있습니다. 각 변경 후에만 로그아웃했다가 다시 로그인하거나 다음 명령을 실행해야 합니다.

소스 파일 이름

Linux에서 사용자 및 시스템 환경 변수 추가

이제 약간의 이론을 알았으니 실습으로 넘어 갑시다. Linux의 로컬 환경 변수는 다음 명령을 사용하여 생성할 수 있습니다.

변수=값
$ 내보내기 var=값

이러한 변수는 현재 터미널 세션에서만 사용할 수 있습니다.

환경 변수를 제거하는 데 사용할 수 있는 몇 가지 명령이 있습니다.

1. 환경 사용

기본적으로 env를 사용하면 설정된 모든 환경 변수를 볼 수 있습니다. 그러나 -i 옵션을 사용하면 일시적으로 모든 쉘 변수를 제거하고 변수 없이 명령을 실행할 수 있습니다.

env -i 명령

Var는 이 명령에 전달하려는 변수입니다.

이 명령은 환경 변수 없이 셸을 시작합니다.

이러한 환경을 시작한 후에는 사용할 수 있는 변수가 없지만 종료한 후에는 모든 것이 제자리로 돌아갑니다.

2. 설정되지 않은 사용

이는 Linux 환경 변수를 제거하는 또 다른 방법입니다. Unset은 현재 세션이 끝날 때까지 이름으로 변수를 제거합니다.

변수 이름 설정 해제

3. 변수 값을 ""로 설정합니다.

이는 Linux에서 환경 변수를 제거하는 가장 쉬운 방법입니다. 변수를 빈 값으로 설정하면 현재 세션의 나머지 부분에서 해당 변수가 제거됩니다.

참고: 이러한 방법을 사용하면 시스템 또는 사용자 변수의 값을 변경할 수 있지만 이는 현재 세션에만 관련됩니다.

사용자 및 시스템 환경 변수 생성

이번 섹션에서는 현재 세션뿐만 아니라 재부팅 후에도 효과가 지속되도록 시스템 및 사용자 변수를 설정하고 삭제하는 방법을 살펴보겠습니다.

1. Linux에서 로컬 변수 설정 및 제거

지역 변수 VAR을 생성하고 임의의 값으로 설정한 다음 설정을 해제하고 삭제되었는지 확인하겠습니다.

VAR1="손실"
$ 에코 $VAR1
$unset VAR1
$ 에코 $VAR1

변수를 생성하는 또 다른 방법은 내보내기 명령을 사용하는 것입니다. 빈 값을 할당하여 제거해 보겠습니다.

VAR="손실" 내보내기
$ 에코 $VAR
$VAR=
$ 에코 $VAR

이제 변수 VAR2를 생성하고 값을 지정해 보겠습니다. 그런 다음 env -i를 실행하여 모든 지역 변수를 일시적으로 제거합니다. 변수 없이 쉘을 시작합니다. 종료를 입력하면 모든 변수가 복원됩니다.

VAR2="손실"
$ 에코 $VAR2
$ env -i bash
$ 에코 $VAR2

사용자 변수 설정 및 제거

원하는 변수를 내보내는 내보내기 명령을 추가하여 홈 디렉터리에서 .bashrc 파일을 편집합니다. 그런 다음 source 명령을 실행하여 변경 사항을 적용합니다. 예를 들어 CD 변수를 만들어 보겠습니다.

다음 줄을 추가합니다(o, 붙여넣기, Esc 및 :wq).

CD 내보내기 "이것은 잃어버린 집입니다"

이제 구성을 업데이트해야 합니다.

소스.bashrc
$에코 $CD

이 변수를 제거하려면 .bashrc에서 제거하면 됩니다.

이제 .bash_profile을 사용하여 환경 변수를 추가해 보겠습니다. 이미 알고 있듯이 이 변수는 원격 로그인 중에만 사용할 수 있습니다.

vi .bash_profile

다음 줄을 추가하세요.

내보내기 VAR2="이것은 잃어버린 집입니다"

그리고 다음 명령을 실행하여 변경 사항을 적용하고 변수가 추가되었는지 확인하세요.

소스.bash_profile
$ 에코 $VAR2

로컬 터미널 세션을 생성했기 때문에 변수를 사용할 수 없습니다. 이제 SSH를 통해 연결하세요.

SSH 사용자@로컬호스트
$ 에코 $VAR2

이 환경 변수를 파일에서 삭제하면 이전 사례와 동일한 방법으로 삭제할 수 있습니다.

논평: 이러한 변수는 항상 사용할 수 있지만 모든 사용자가 사용할 수 있는 것은 아닙니다.

시스템 환경 변수 설정 및 제거

/etc/bash.profile에 변수를 추가하여 원격 세션을 제외한 모든 터미널 세션의 모든 사용자가 사용할 수 있는 변수를 생성해 보겠습니다.

vi /etc/bash.profile

내보내기 VAR="이것은 시스템 전체 변수입니다"

그런 다음 업데이트합니다.

소스 /etc/bash.bashrc

이제 모든 터미널에서 모든 사용자가 이 변수를 사용할 수 있습니다.

에코 $VAR
$sudo su
$ 에코 $VAR
$su -
$ 에코 $VAR

이 시스템에 원격으로 연결하는 모든 사용자가 환경 변수를 사용할 수 있도록 하려면 /etc/profile 파일을 편집하십시오.

내보내기 VAR1="이것은 원격 세션에만 적용되는 시스템 전체 변수입니다."

구성을 업데이트하고 변수의 가용성을 확인하세요. 원격으로만 사용할 수 있습니다.

소스 /etc/profile
$ 에코 $VAR1

원격 및 로컬 세션 모두에 액세스할 수 있도록 Linux에서 환경 변수를 추가해야 하는 경우 해당 변수를 /etc/environment로 내보냅니다.

vi /etc/환경

내보내기 VAR12="나는 어디에서나 사용할 수 있습니다."

우리는 다음을 확인합니다:

소스 /etc/환경
$ 에코 $VAR12
$sudo su
$ 에코 $VAR12
$ 종료
$ssh 로컬호스트
$ 에코 $VAR12

2.2. 환경 변수

운영 체제는 다음과 같은 특별한 유형의 리소스를 지원합니다. 환경 변수 (환경 변수). 이 변수는 쌍입니다. 이름 - 값 . 이름은 문자로 시작할 수 있으며 문자, 숫자, 밑줄로 구성될 수 있습니다.

명령줄에서 변수 값을 대체하려면 변수 이름 앞에 $ 기호를 붙입니다.

$ echo $USER 손님

변수가 설정되지 않은 경우 빈 문자열이 반환됩니다.

변수의 값을 설정하려면 할당 연산자를 사용하십시오(Bourne과 유사한 쉘의 경우).

$TEST=테스트

또는 내장 집합 연산자(C와 유사한 경우):

$ 세트 TEST=테스트

인수 없이 set 명령은 환경에 설정된 모든 변수의 값을 나열합니다.

$ set COLUMNS=197 CVS_RSH=ssh DIRSTACK=() EUID=1000 GROUPS=() G_BROKEN_FILENAMES=1 HISTFILE=/home/guest/.bash_history HISTFILESIZE=1000 HISTSIZE=1000 HOME=/home/guest HOSTNAME=myhost HOSTTYPE=i686 IFS =$" \t\n" INPUTRC=/etc/inputrc KDEDIR=/usr KDEDIRS=/home/guest/.local/ KDE_IS_PRELINKED=1 KDE_NO_IPV6=1 LANG=ru_RU.UTF-8 LESSOPEN="|/usr/bin/ lesspipe.sh %s" LINES=65 LOGNAME=guest ....

변수는 특정 프로세스에 대해 로컬이거나 세션에 대해 전역일 수 있습니다. 다음 명령을 호출하여 변수 앞에 로컬 값을 설정할 수 있습니다.

$ TEST=test1 sh -c "echo $TEST" test1

Bourne과 유사한 인터프리터(sh, ksh, bash, zsh, pdksh...)의 경우 인터프리터의 내장 명령 env를 호출하고, 이 경우 printenv를 호출하여 세션에 대한 변수 세트의 내용을 평가할 수 있습니다. C-Shell 클론 인터프리터(csh, tcsh. ..):

$ env HOSTNAME=myhost TERM=xterm SHELL=/bin/bash HISTSIZE=1000 KDE_NO_IPV6=1 SSH_CLIENT=172.16.0.9 50487 22 QTDIR=/usr/lib/qt-3.3 QTINC=/usr/lib/qt-3.3/include SSH_TTY =/dev/pts/6 USER=guest MOZILLA_CERTIFICATE_FOLDER=/home/guest/.evolution/ KDEDIR=/usr MAIL=/var/spool/mail/guest PATH=/usr/games:/usr/local/bin:/bin :/usr/bin:/home/guest/bin INPUTRC=/etc/inputrc PWD=/home/guest KDE_IS_PRELINKED=1 LANG=ru_RU.UTF-8 KDEDIRS=/home/guest/.local/ SSH_ASKPASS=/usr/libexec /openssh/gnome-ssh-askpass SHLVL=1 HOME=/home/guest LOGNAME=guest QTLIB=/usr/lib/qt-3.3/lib CVS_RSH=ssh SSH_CONNECTION=172.16.0.9 50487 172.16.2.9 22 LESSOPEN=|/usr /bin/lesspipe.sh %s G_BROKEN_FILENAMES=1 _=/bin/env

명령 세트 껍데기스크립트라는 명령 파일로 컴파일될 수 있습니다. 여기서 특별한 유형의 주석의 첫 번째 줄은 이 세트를 실행하기 위한 명령 해석기를 지정합니다. 예를 들어, 텍스트 편집기에서 다음 내용을 포함하는 test라는 파일을 생성해 보겠습니다.

#!/bin/sh echo TEST 변수: echo $TEST

이 프로그램은 "TEST 변수: "라는 텍스트 메시지와 TEST 변수 값(지정된 경우)을 표준 출력으로 인쇄합니다. 명령 해석기에 매개변수로 전달하여 명령줄에서 실행할 수 있습니다.

$sh 테스트 테스트 변수:

내보내기(Bourne) 또는 setenv(C-SHell) 문을 사용하여 전역 변수를 만들 수 있습니다.

$ 내보내기 TEST=test1 $ sh 테스트 TEST 변수: test1

다음 명령을 호출하여 특정 프로그램을 실행하기 위한 변수의 로컬 값을 설정할 수 있습니다.

$ TEST=test2 sh 테스트 TEST 변수: test2

환경 변수 제거는 unset 문을 사용하여 수행됩니다.

셸의 매개변수 개념 세게 때리다기존 프로그래밍 언어의 변수 개념과 유사합니다. 매개변수 이름(또는 식별자)은 알파벳 문자, 숫자, 밑줄(단어의 첫 번째 문자만 숫자일 수 없음)로 구성된 단어, 숫자 또는 다음 특수 문자 중 하나일 수 있습니다. * , @ , # , ? , - (하이픈), $ , ! , 0 , _ (밑줄).

매개변수에 값이 할당되면 매개변수가 설정되거나 설정되었다고 합니다. 값은 빈 문자열일 수도 있습니다. 매개변수 값을 표시하려면 기호를 사용하십시오. $ 그의 이름 앞에. 응, 팀

$ 에코 이름

화면에 단어가 표시됩니다 이름, 그리고 팀

$에코 $이름

name 변수의 값을 반환합니다(물론 변수가 설정된 경우).

5.6.1 다양한 매개변수

매개변수는 세 가지 클래스로 구분됩니다. 위치 매개변수, 특수 매개변수(이름은 방금 나열된 특수 문자입니다) 및 쉘 변수.

이름(식별자) 위치 매개변수하나 이상의 숫자로 구성됩니다(단일 0이 아님). 위치 매개변수 값은 쉘이 시작될 때 주어진 인수입니다(첫 번째 인수는 위치 매개변수 1의 값 등입니다). 내장된 명령을 사용하여 위치 매개변수의 값을 변경할 수 있습니다. 세트. 이러한 매개변수의 값은 쉘이 기능 중 하나를 실행하는 동안에도 변경됩니다(이에 대해서는 아래에서 설명합니다). 부분 5.8).

특수 매개변수패턴이며, 교체(대체)는 다음과 같이 수행됩니다.

표 5.2.특수 매개변수.

매개변수

대체 규칙

첫 번째 매개변수부터 시작하여 위치 매개변수로 대체되었습니다. 큰따옴표 안에 대체가 이루어지면 이 매개변수는 특수 IFS 변수(아래 설명)의 첫 번째 문자로 구분된 모든 위치 매개변수로 구성된 단일 단어로 대체됩니다. 즉, ``$*""는 ``$1c$2c..."와 동일합니다. 여기서 c는 IFS 변수 값의 첫 번째 문자입니다. IFS가 비어 있거나 값이 설정되지 않은 경우 매개변수는 공백으로 구분됩니다.

첫 번째 매개변수부터 시작하여 위치 매개변수로 대체되었습니다. 큰따옴표 안에 대체하는 경우 각 매개변수는 별도의 단어로 대체됩니다. 따라서 ``$@""는 ""$1"" ""$2""와 동일합니다. 위치 매개변수가 없으면 값이 할당되지 않습니다(@ 매개변수는 단순히 제거됩니다).

위치 매개변수 개수의 10진수 값으로 대체됨

실행 중인 마지막 포그라운드 프로그램 채널의 종료 상태로 대체됩니다.

(하이픈)

내장 명령을 사용하여 설정된 현재 플래그 값 세트로 대체됩니다. 세트또는 쉘 자체를 시작할 때

셸의 프로세스 식별자(P ID)로 대체됨

가장 최근에 실행된 백그라운드(비동기적으로 실행된) 명령의 프로세스 식별자(P ID)로 대체됩니다.

실행할 셸 또는 스크립트의 이름으로 대체됩니다. 만약에 세게 때리다배치 파일을 실행하기 위해 실행되며 $0은 파일 이름입니다. 그렇지 않으면 이 값은 셸의 전체 경로와 같습니다.

(밑줄)

실행된 이전 명령의 마지막 인수로 대체됩니다(매개변수 또는 변수인 경우 해당 값이 대체됩니다).

위 표에 나열된 특수 매개변수는 참조만 가능하다는 점에서 다릅니다. 값을 할당할 수 없습니다.

변하기 쉬운쉘의 관점에서는 이름으로 표시되는 매개변수입니다. 값은 다음 연산자를 사용하여 변수에 할당됩니다.

$name=값

어디 이름변수의 이름이고, — 할당된 값(빈 문자열일 수 있음) 변수 이름은 숫자와 문자로만 구성할 수 있으며 숫자로 시작할 수 없습니다. 값은 임의의 텍스트일 수 있습니다. 값에 특수 문자가 포함된 경우 따옴표로 묶어야 합니다. 물론 할당된 값에는 이러한 따옴표가 포함되지 않습니다. 변수가 설정되면 쉘 내장 명령을 사용하여 제거할 수 있습니다. 설정되지 않음.

할당된 값을 가진 모든 설정된 쉘 변수 세트를 환경 또는 쉘 환경이라고 합니다. 명령을 사용하여 볼 수 있습니다 세트매개변수 없음(아마도 파이프라인을 구성해야 할 수도 있음) "설정 | 덜"). 이 명령의 출력에는 모든 환경 변수가 알파벳순으로 나열됩니다. 특정 변수의 값을 보려면 명령 대신 다음을 수행하십시오. 세트(출력에서 원하는 변수를 계속 검색하고 검색할 수 있음) 다음 명령을 사용할 수 있습니다.

$에코 $이름

(단, 이 경우 관심 있는 변수의 이름을 알고 있어야 합니다.)

명령 출력에 표시되는 변수는 다음과 같습니다. 세트, 매우 흥미로운 변수가 있습니다. 예를 들어 RANDOM 변수에 주의하세요. 여러 번 연속으로 명령을 실행하면

$ 에코 $RANDOM

매번 새로운 가치를 얻게 될 것입니다. 사실 이 변수는 0 - 32,768 사이의 임의의 정수를 반환합니다.

5.6.2 쉘 프롬프트

매우 중요한 변수 중 하나에는 이름이 있습니다. PS1. 이 변수는 초대 유형을 지정합니다. 세게 때리다사용자가 다음 명령을 입력하기를 기다리고 있을 때 출력됩니다. 기본적으로 이 변수는 "\s-\v\$ "로 설정됩니다. 실제로 세게 때리다다양한 상황에서 사용되는 네 가지 초대장이 있습니다. 변하기 쉬운 PS1쉘이 명령 입력을 기다리고 있을 때 발행되는 프롬프트 유형을 지정합니다. 변수로 지정된 보조 프롬프트 PS2, 쉘이 사용자가 명령이나 프로그램 실행을 계속하는 데 필요한 추가 데이터를 입력하기를 기다리고 있을 때 나타납니다. 기본 변수 PS2"라는 뜻을 가지고 있습니다. >" . 명령을 실행할 때 이미 이 프롬프트를 보았을 수도 있습니다. 고양이키보드의 데이터를 파일에 입력합니다. 또 다른 예는 다음 명령입니다. FTP, 출시 후 초대도 이 형식을 취합니다.

변수 프롬프트 PS3, 명령에 사용됨 선택하다. 변수 프롬프트 PS4, 당시 각 명령 앞에 인쇄됩니다. 세게 때리다실행 진행 상황을 모니터링합니다. 기본값은 " + ".

원한다면 변수 유형을 변경할 수 있습니다. PS1그리고 PS2. 이 경우 키보드에서 입력한 모든 기호는 물론 프롬프트 문자열을 생성할 때 표에 따라 디코딩되는 특정 수의 특수 문자를 사용할 수 있습니다. 5.3(예를 들어 그 중 일부만 나열합니다. 전체 목록은 해당 유틸리티의 매뉴얼 페이지를 참조하세요. 세게 때리다) .

표 5.3.초대장 생성을 위한 특수 문자

상징

그 의미

경고음(ASCII 코드 07)

"일, 월, 일" 형식의 날짜입니다(예: 10월 17일 수요일).

첫 번째 점까지의 호스트 이름

전체 호스트 이름

24시간 형식의 현재 시간: HH:MM:SS(시:분:초)

12시간 형식의 현재 시간: HH:MM:SS

오전/오후 12시간 형식의 현재 시간

쉘을 시작한 사용자의 이름

현재 작업 디렉터리의 전체 이름(루트에서 시작)

현재 작업 디렉터리(경로가 지정되지 않음)

쉘이 수퍼유저로 실행 중인 경우 # 기호, 기호 $ , 일반 사용자가 쉘을 시작한 경우.

\nnn

8진수 코드가 nnn인 문자

새 줄(줄 바꿈)

쉘 이름

현재 팀 번호

백슬래시

인쇄되지 않는 일련의 문자 시작(이 문자는 도구 설명 텍스트에 일련의 터미널 제어 문자를 포함하는 데 사용될 수 있음)

인쇄할 수 없는 문자 시퀀스의 끝

명령 기록에 있는 이 명령의 일련 번호

현재 명령 번호(현재 세션 내에서 실행 중인 명령의 일련 번호)는 명령 기록 목록에 있는 이 명령의 번호와 다를 수 있습니다. 후자에는 명령 기록 파일에 저장된 명령이 포함되어 있기 때문입니다.

쉘이 힌트를 정의하는 변수의 값을 읽은 후에는 매개변수 확장 규칙, 명령 이름 및 산술 표현식의 대체, 단어 분할 규칙에 따라 해당 값을 대체할 수 있습니다. 이러한 규칙은 아래 섹션에서 논의됩니다. 5.7.

예를 들어, 명령을 실행한 후 (문자열에 공백이 있으므로 따옴표가 필요합니다)

# PS1="[\u@\h \W]\$"

표준 프롬프트에는 대괄호, 사용자 이름, 기호가 표시됩니다. @ , 컴퓨터 이름, 공백, 현재 디렉터리 이름(경로 없음), 닫는 대괄호 및 기호 $ (단순 사용자가 셸에서 실행 중인 경우) 또는 # (쉘이 루트로 실행 중인 경우)

5.6.3 변수

또 다른 매우 중요한 변수에는 이름이 있습니다. . 이는 디렉토리에 대한 경로 목록을 지정합니다. 세게 때리다명령줄에 파일의 전체 경로가 지정되지 않은 경우 파일(특히 명령이 포함된 파일)을 검색합니다. 이 목록의 개별 디렉터리는 콜론으로 구분됩니다. 기본 변수 디렉토리를 포함합니다 /usr/로컬/빈, /bin, /usr/bin, /usr/X11R6/bin,즉 다음과 같습니다.

/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:

이 목록에 디렉터리를 추가하려면 다음 명령을 실행해야 합니다.

# PATH=$PATH:새_경로.

검색을 수행할 때 쉘은 PATH 변수에 나열된 순서대로 디렉토리를 검색합니다.

PATH 변수에 마침표를 추가하여 이 목록에 현재 디렉터리를 포함할 수 있습니다. 그러나 이는 보안상의 이유로 권장되지 않습니다. 공격자는 수퍼유저가 자주 실행하는 명령 중 하나와 이름이 일치하는 공용 디렉터리에 명령을 넣을 수 있지만 완전히 다른 작업을 수행할 수 있습니다(특히 현재 디렉터리가 디렉터리의 시작 부분에 있는 경우). 검색 경로 목록).

5.6.4 변수 IFS

이 변수는 실행을 위해 명령줄을 실행하기 전에 쉘이 수행하는 명령줄 변환의 단어 분할 작업에 사용되는 내부 필드 구분자를 지정합니다. 이 변수의 기본값은 "<Пробел><Символ_ новой_ строки>".

5.6.5 현재 및 홈 디렉터리

현재 디렉터리의 이름은 환경 변수(PWD라는 이름)에 저장되며 이 변수의 값은 프로그램이 시작될 때마다 변경됩니다. CD(또한 Midnight Commander 등을 통해 다른 방법으로 현재 디렉터리를 변경할 때도 마찬가지입니다.)

마찬가지로 프로세스를 시작한 사용자의 홈 디렉터리의 전체 이름(및 경로)은 HOME 변수에 저장됩니다.

5.6.6 팀 내보내다

쉘이 프로그램이나 명령을 실행할 때 일부 환경 변수를 전달합니다. 환경 변수가 셸에서 시작된 프로세스에 전달되려면 특수 명령을 사용하여 설정해야 합니다. 내보내다, 즉 대신

$name=값

적어야 해

$내보내기 이름=값

이 경우 쉘에서 시작된 모든 프로그램(쉘 자체의 보조 인스턴스 포함)은 이러한 방식으로 정의된 변수에 액세스할 수 있습니다. 즉, 해당 값을 이름으로 호출할 수 있습니다.

V. Kostromin(rus-linux 닷넷의 kos) - 5.6. 매개변수 및 변수. 쉘 환경