$PATH를 변경하면 서브쉘에 영향을 주지만 $foo를 변경하면 영향을 받지 않는 이유는 무엇입니까?

$PATH를 변경하면 서브쉘에 영향을 주지만 $foo를 변경하면 영향을 받지 않는 이유는 무엇입니까?
$ unset foo
$ unset bar
$ echo $foo

$ echo $bar

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
$ foo=a
$ bar=b
$ export bar
$ echo $foo
a
$ echo $bar
b
$ PATH=
$ echo $PATH

$ /bin/bash
bash: lesspipe: No such file or directory
bash: dircolors: No such file or directory
bash: ls: No such file or directory
$ echo $foo

$ echo $bar
b
$ echo $PATH

$

보시다시피 변경 사항은 $PATH서브셸에 영향을 미치며 export다른 변수를 편집해야 합니다. 왜?

답변1

실제로 두 가지 유형의 변수가 있습니다.

  1. 환경 변수
  2. 쉘 변수

상황을 더 복잡하게 만들기 위해 둘은 동일하게 보이며 명령을 사용하여 셸 변수를 환경 변수로 변환할 수 있습니다 export.

env명령은 현재 환경 변수 세트를 표시합니다.

$ myvar=100
$ env | grep myvar
$ export myvar
$ env | grep myvar
myvar=100

명령 수명 동안 변수를 일시적으로 내보낼 수도 있습니다.

$ env | grep anothervar
$ anothervar=100 env | grep anothervar
anothervar=100
$ env | grep anothervar
$ 

쉘이 시작되면 여러 환경 변수(0일 수 있음)를 상속받습니다.

시작 스크립트(예: .bash_profile디렉터리 .bashrc의 파일 /etc)도 변수를 설정하고 내보낼 수 있습니다.

마지막으로 환경이 비어 있으면 쉘 자체가 환경 변수에 대한 기본값을 설정할 수 있습니다. 예를 들어

$ PATH=foo /bin/bash -c 'echo $PATH'
foo
$ PATH= /bin/bash -c 'echo $PATH'

$ unset PATH
$ /bin/bash -c 'echo $PATH'
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.

답변2

이 글을 읽어보시길 권합니다기사.

쉘 변수와 환경 변수 사이에는 큰 차이가 있습니다.환경적 요인 중 하나이며,이미 내보냈습니다.(기본적으로) 따라서 이를 변경하면 사용 중인 현재 셸과 다른 모든 셸(모든 하위 셸 또는 프로세스)이 영향을 받습니다.

명령을 찾을 때 시스템이 확인할 디렉터리 목록입니다. 따라서 변경하거나 추가하려는 경우에도 PATH="$PATH:...명령을 실행하기 위한 원래 경로가 필요하므로 사용하는 것이 좋지만 완전히 변경하는 경우 절대 경로를 입력하여 명령을 사용해야 합니다. 예를 들어 /bin/pwd.

하지만부자내보낸 내용은 셸이나 프로세스에 영향을 미치지 않습니다. 환경 변수로 만들려고 하지만 유효한 항목을 정의하지 않았기 때문에 셸이나 프로세스에 어떤 영향을 미치는지 알 수 없습니다. , 실제로 이것은 일부 임시 데이터를 추적하기 위해 자신의 필요에 따라 정의한 것이므로 이를 쉘 변수로 유지하는 것이 좋습니다. 예를 들어, 수학 프로젝트를 하려고 할 때 몇 가지를 정의하고 짧은 시간 안에 사용해야 할 수 있으므로 내보내지 않고 일부 쉘 변수만 설정하면 됩니다.

제 말이 정확하길 바라지만, 그래도 주어진 기사를 읽고 완전히 이해할 수 있도록 일부 변수를 변경해 보시기를 권장합니다. 그런데 환경 변수를 영구적으로 유지하려면 해당 변수를 .bashrc또는 .bash_profile.

관련 정보