$ENV_VAR과 `env_var`의 주요 차이점은 무엇입니까?

$ENV_VAR과 `env_var`의 주요 차이점은 무엇입니까?

나는 이것이 매우 간단한 질문이라고 생각합니다: $HOSTNAME과 `hostname`과 같은 환경 변수를 사용하는 것의 주요 차이점은 무엇입니까? 어느 것이 적절하며 이를 대표하는 두 가지 가능성이 있는 이유는 무엇입니까?

답변1

무인 세션에서 일정 시간이 지나면 오래될 수 있는 변수에 의존하는 것보다 현재 값을 가져오는 명령에 의존하는 것이 더 적절합니다.

[centos@abc ~]$ /bin/hostname
abc.dns.com
[centos@abc ~]$ echo $HOSTNAME
abc.dns.com
[centos@abc ~]$ uname -n
abc.dns.com

[centos@abc ~]$ sudo /bin/hostname xyz.dns.coom
[centos@abc ~]$ uname -n
xyz.dns.coom
[centos@abc ~]$ /bin/hostname
xyz.dns.coom
[centos@abc ~]$ echo $HOSTNAME
abc.dns.com
[centos@abc ~]$ 

$HOSTNAME이것은 쉘 초기화 초기에 출력을 캡처하여 확장/평가되는 쉘 변수이며, 호스트 이름이 동적이거나 매번 업데이트되지 않는 것은 분명하다고 생각합니다 . /bin/hostname종속 출력은 /bin/hostname동일한 프로그램 공간에서 호스트 이름을 평가한 동일한 스크립트나 프로그램이 아닌 한 $HOSTNAME보다 더 안정적입니다.

간단히 말해서, 명령의 출력은 $HOSTNAME(다른 일반적인 SHELL 변수처럼 더 이상 사용되지 않을 수 있음)을 사용하는 것보다 호스트 이름을 아는 더 적절한 방법일 /bin/hostname수 있습니다 ./bin/uname -m

쉘이 $HOSTNAME을 어떻게 상속하는지 궁금하다면 쉘이 출력에서 ​​이 변수를 다시 정의하는 /etc/profile(또는 /etc/bashrc)과 같은 전역 초기화(rc) 파일을 읽는다는 것을 알아야 합니다 /bin/hostname.

/bin/hostname( HOSTNAME 변수는 시스템 시작 스크립트가 호출되기 때문에 미리 명령을 실행하지 않는 쉘이 아닌 다른 프로그램에 의해 정의/초기화될 수 있다는 점도 알아두는 것이 중요하다 /etc/rc.sysinit)

답변2

환경 변수는 한 번만 설정됩니다(특정 프로세스에 대해, 한 프로세스가 다른 프로세스를 시작하면 하위 프로세스가 상위 프로세스의 환경을 상속함). 따라서 액세스는 $HOSTNAME메모리의 값을 직접 읽습니다. 대신, 명령 대체 `hostname`( 철자라고도 함 )가 평가될 때마다 $(hostname)명령이 실행됩니다 hostname.

$HOSTNAME와 의 경우에는 hostname사실상 차이가 없습니다. $HOSTNAME약간 더 빠릅니다. 원칙적으로 $HOSTNAME실행 중인 경우에는 잘못된 것일 수 있으며 ( HOSTNAME=some_bogus_value다른 프로그램을 설치한 경우에는 $(hostname)잘못된 것일 수 있음 ) 호스트 이름을 변경한 경우에만 최신 상태가 됩니다.hostname$PATHhostname

HOSTNAME환경 변수는 자주 사용되며(예: 쉘 프롬프트에서) 거의 변경되지 않기 때문에 (항상은 아니지만) 자주 사용됩니다 . (대부분의 시스템에는 hostname) 값을 설정하고 호스트 이름을 변경하는 명령(보통 부팅 프로세스 초기에 수행됨)이 있습니다 .HOSTNAMEHOSTNAME=$(hostname)hostname $(cat /etc/hostname)

관련 정보