eval "$(/opt/homebrew/bin/brew shellenv)" 명령은 실제로 무엇을 수행합니까?

eval "$(/opt/homebrew/bin/brew shellenv)" 명령은 실제로 무엇을 수행합니까?

Homebrew는 우리 eval $(/opt/homebrew/bin/brew shellenv)에게 ~/.zprofile.

저는 쉘 스크립팅을 처음 접했습니다. 나는 $varvar라는 변수를 참조하는 것에 대해 알고 있지만 그게 전부입니다. 경로를 넣는다는 것은 무엇을 의미합니까 $()? 여기에 또 다른 주장이 있는데 shellenv, 그게 무슨 뜻인가요?

답변1

$()명령 대체. 대괄호 안의 명령을 실행하고 해당 명령의 출력을 반환합니다.

프로그램의 출력을 변수에 넣는 데 자주 사용됩니다. 예를 들어

$ month=$(date +%m)
$ echo $month
02

또는 한 프로그램의 출력을 다른 프로그램의 인수로 사용합니다.

$ printf '%s\n' $(date +%B)
February

(그렇습니다. 이것은 단지 실행만 해도 동일한 출력이 생성되기 printf때문에 조작된 예입니다 . 그러나 작동 방식을 보여줍니다.)date +%B

대괄호 안의 명령은 단일 프로그램부터 긴 파이프라인 명령에 이르기까지 필요한 만큼 간단하거나 복잡할 수 있습니다. 예를 들어, 나는 데비안 시스템에서 오래된 커널 패키지를 제거하기 위해 종종 다음 명령을 사용합니다:

apt-get purge $(dlocate -k | grep '6\.0\.0-[245]')

그런데 백틱(`)을 사용하는 스크립트도 볼 수 있습니다. 이는 레거시 이유로 지원되지만 새 스크립트에서는 사용해서는 안 되는 오래되고 더 이상 사용되지 않는 명령 대체 형식입니다.

와 함께 사용하면 eval쉘이 출력을 실행하게 됩니다. 이 경우 run은 /opt/homebrew/bin/brew shellenv예를 들어 많은 텍스트를 반환하고 var=value현재 eval셸에서 실행하여 해당 변수를 원하는 값으로 설정합니다.

help eval배쉬 에서 :

eval:eval [arg ...]

매개변수를 쉘 명령으로 실행하십시오.

ARG를 단일 문자열로 결합하고 결과를 셸에 대한 입력으로 사용하고 결과 명령을 실행합니다.

종료 상태: 명령의 종료 상태를 반환하거나 명령이 비어 있는 경우 성공을 반환합니다.

/opt/homebrew/bin/brew shellenv단독으로 실행하여 어떤 출력이 생성되는지 확인하세요 .

답변2

Brew가 작동하는 데 필요한 환경 변수를 내보냅니다. 예를 들어, 없이 실행하면 evalFish 셸에 다음과 같은 결과가 출력됩니다.

$ /opt/homebrew/bin/brew shellenv

set -gx HOMEBREW_PREFIX "/opt/homebrew";
set -gx HOMEBREW_CELLAR "/opt/homebrew/Cellar";
set -gx HOMEBREW_REPOSITORY "/opt/homebrew";
set -q PATH; or set PATH ''; set -gx PATH "/opt/homebrew/bin" "/opt/homebrew/sbin" $PATH;
set -q MANPATH; or set MANPATH ''; set -gx MANPATH "/opt/homebrew/share/man" $MANPATH;
set -q INFOPATH; or set INFOPATH ''; set -gx INFOPATH "/opt/homebrew/share/info" $INFOPATH;

그런 다음 eval실제로 set명령을 실행합니다.

세션에 이미 로드된 경우에는 아무것도 출력되지 않습니다.

관련 정보