나는 이것이 매우 간단한 질문이라고 생각합니다: $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
$PATH
hostname
HOSTNAME
환경 변수는 자주 사용되며(예: 쉘 프롬프트에서) 거의 변경되지 않기 때문에 (항상은 아니지만) 자주 사용됩니다 . (대부분의 시스템에는 hostname
) 값을 설정하고 호스트 이름을 변경하는 명령(보통 부팅 프로세스 초기에 수행됨)이 있습니다 .HOSTNAME
HOSTNAME=$(hostname)
hostname $(cat /etc/hostname)