2009-03-24 2 views
1

env, setunset과 같은 환경 명령을 실행할 때 문제가 발생하지만 어떻게됩니까?환경 변수로 무엇을합니까?

set hello='hello world!' 
unset find 

명령으로 무엇을합니까? 변경 사항은 영구적입니까 일시적입니까? 변경 사항을 어디서 볼 수 있습니까? 나는 Ubuntu-newbie이다.

+0

이것은 이런 종류의 질문에 적합한 장소가 아니므로 우분투 커뮤니티 포럼이 더 좋을 것이라고 생각합니다. – ninesided

+0

ninesided 나는 일을 단순하게 유지하려고 노력한다. 제목을 혼동하지 않도록하십시오. 나는 암시 적으로 프로그래밍과 관련된 관점을 취했다. 나는 그들에게 프로그래머의 관점을 듣고 싶다. –

답변

2

만들어 각 프로세스는 자신의 환경을 얻을 수있는 그 과정만큼 오래 살아. 쉘은 다른 프로세스와 같습니다. 그 환경은 그 자체가 있습니다.

인수없이 'set'을 입력하면 존재하는 것을 볼 수 있습니다. 검색 경로, 원하는 X11 디스플레이, 홈 디렉토리 (/ home/yourname이 아닌 경우) 등을 제어 할 수있는 많은 설정이 있습니다.

정말 필요한 것이 무엇이든 사용하십시오. 언제든지 다른 응용 프로그램이 읽을 수있는 변수 나 쉘에서 액세스 할 수있는 변수에 유용한 정보 (예 : 일부 프로그램의 명령 행 옵션 목록)를 저장해야 할 때마다 환경을 사용하십시오. 예를 들어

:

USUAL_CONFIGURE_OPTS="--prefix=/home/charlie --sysconfdir=/home/charlie/tmp-etc" 
./configure $USUAL_CONFIGURE_OPTS --and-additional-arguments 

편집 : 프로그래머로

, 나는 사용자의 기본 설정을 결정하고 순종 할 수있는 환경을 참조하십시오. 예를 들어 변수 POSIXLY_CORRECT가 설정되면 내 프로그램의 출력에 영향을줍니다. 환경은 사용자가 프로그램에 어떻게 행동하는지 알려주는 곳입니다. 또한 위에서 설명한 것처럼 환경은 사용자가 유용한 비트를 저장하는 편리한 장소입니다.

다시 (귀하의 의견에 응답) 실행되는 모든 프로그램은 하나의 프로세스입니다. 프로세스가 자체 주소 공간 (자체 메모리)을 가져 오면 해당 환경이 해당 공간에 저장됩니다. 즉, 환경은 해당 프로세스에만 해당되며 프로세스 자체만큼만 지속됩니다.

편집 2 :

나는 이제 완전히 당신의 질문을 이해한다고 생각합니다. 누군가가 '가상 환경'이라고 말하면 커널이 가상 메모리로 매핑하는 응용 프로그램의 주소 공간에 환경이 있다는 사실을 알게됩니다 (일부 페이지는 물리적 메모리에 있거나 일부는 스왑에 있거나 동적 객체 공유, 기타).

프로세스가 명시 적으로 해당 특정 영역에 대한 맵을 작성하여 다른 프로세스와 공유하지 않는 한 프로세스는 다른 환경에 액세스 할 수 없습니다. 다시 말하지만 프로세스의 주소 공간은 완전히 사적이며 다른 프로세스와 격리되어 있습니다. 환경 변수는 해당 주소 공간 내에 있습니다. 그렇지 않으면 프로세스에서 액세스하거나 조작 할 수 없습니다.

+0

유닉스 파워 툴 (Unix Power Tools)에서 리눅스 텍스트의 거의 모든 것을 고려할 수 있음을 이해했습니다. 이후 장에서 진술은 완전히 사실이 아니라고 덧붙였다. 그래서 나는 당신의 용어 '프로세스'의 사용에 대해 혼란스러워합니다. 프로세스는 신호를 보낼 수 있으며, 텍스트이며 실제로 어떻게 정의됩니까? –

+0

@UnixBasics에서 새로 생성 된 각 프로세스 (실행되는 프로그램)는 메모리에서 자체 주소 공간을 갖습니다. 다른 프로세스와 완전히 분리되어 있습니다. 프로세스 A는 공유 메모리가 명시 적으로 설정되어 있지 않으면 프로세스 B의 메모리를 읽을 수 없습니다. 각 프로세스의 환경은 자체 환경입니다. –

+0

@ tinkertim 설명해 주셔서 감사합니다! 프로그래머가 '가상'환경 변수에 대해 말할 때, 그들은 무엇을 의미합니까? 프로세스 A는 다른 프로그램이 액세스 할 수있는 (A의 실제 (?) 메모리에 액세스 할 수없는) 가상 메모리의 정확한 위치를가집니다. env.vars가 A의 가상 env.vars를 공유합니까? –

4

변경 사항은 일시적입니다. 현재 셸에서만 유지됩니다. ~/.profile 또는 ~/.bash_profile (이미 존재하는 것을 사용하고, 보시려면 ls -a ~을 사용하십시오)에 환경 변수를 설정하면, 새 파일을 열 때마다 이러한 파일이 "소스"되기 때문에 사실상 영구적입니다. 예를 들어

, 당신이 추가 한 경우 :

export HELLO="world" 

당신의 ~/.profile, 새 쉘을 열 때마다 사용할 수있게 것이라고 변수가 (당신이 source ~/.profile하여 현재 쉘을 새로 고칠 수 있습니다)에.

$ echo $HELLO 
world 

환경 변수는 시스템 전체에서 스크립트에 사용됩니다. 예를 들어 좋아하는 편집기를 설정처럼 당신은 일을 수행 할 수 있습니다

export EDITOR="nano" 

당신은 예를 들어, 프롬프트 문자열을 설정 할 수있는 하나의 유용한 것 :

Bill:~$ export PS1="\u is awesome$ " 
Bill is awesome$ ls 
Bill is awesome$ du -h 
Bill is awesome$ ...etc... 
0

인수 목록과 마찬가지로 환경 변수를 저장하는 프로세스에 할당 된 메모리 섹션이 있습니다. KEY = VALUE 쌍의 구분되지 않은 정렬 된 목록이 \0이라고 생각합니다.

이 메모리 비트는 fork()으로 복사되고 exec()으로 지워지지 않으므로 변경 내용이 하위 프로세스로 복사됩니다.

유닉스 쉘은 export이 사용될 때까지이 환경 변수 메모리에 변수를 쓰지 않습니다. 그것은 쉘 변수와 환경 변수의 차이입니다.

bash 쉘에서 "x=2"은 환경 변수를 설정하지 않습니다. "export x=2" 또는 "x=2; export x"입니다.

관련 문제