아니요, 거기는 아닙니다.

아니요, 거기는 아닙니다.

envprintenv다 외부 명령, 즉 bash 내장 명령이 아닌 실행 파일입니다. 문제는 그들이 출력하는 일부 환경 변수(즉, _더 많은 것이 있는지 알고 싶습니다)가 이를 호출하는 셸에 속하지 않는다는 것입니다.여기.

답변1

declare -x또는 내보낸 것으로 표시된 모든 변수를 나열합니다., 앞으로도 그럴 것이다export:

$ declare -x
declare -x ALTERNATE_EDITOR=""
declare -x COLORFGBG="7;0"
declare -x COMMAND_MODE="unix2003"
...
declare -x VISUAL="gvim"

내보내지 않은 지역 변수는 나열되지 않지만 셸의 외부 환경에서 상속된 변수는 포함됩니다.

declare -x -F -p내보낸 함수는 모두 생략됩니다.

답변2

Bash 매뉴얼의 문구에 주목하세요: "모든 변수두드러진우리는 프로세스의 "환경"을 시스템 호출 envp에 대한 인수로 전달되는 것과 execve이 인수를 통해 전달되는 것만으로 생각합니다. 나머지는 단지 환상일 뿐입니다. 호출 프로세스(셸 또는 다른 종류의 프로세스)는 문서화된 동작 방식에 따라 수신된 변수로 무엇이든 할 수 있습니다. 수신된 변수를 하위 프로세스에 전달할 수도 있고 그렇게 하지 않도록 선택할 수도 있습니다.

내 목표는 상위 프로세스에서 하위 프로세스로 자동으로 전달되는 환경 변수의 마법 블록이 없다는 것입니다. 상위 프로세스는 자체 "환경"을 사용하여 원하는 작업을 수행하고, 이를 크랙하고, 메모리에서 암호화하고, 프로세스 공간의 다른 주소로 복사하는 등(Bash가 수행하는 작업) 등을 수행할 수 있습니다. 프로세스 환경을 확인하기 위한 외부 메커니즘이나 커널 메커니즘은 있을 수 없습니다. (잠깐만 기다려 주세요. /proc/PID/environ아래 설명을 읽어보세요.) 유일한 중요한 점은 내보내기 프로세스가 Bash에 대한 자체 규칙에 따라 조각을 수집하고 환경을 하위 프로세스에 전달해야 한다는 것입니다. 규칙은 Bash 매뉴얼에 나열되어 있습니다.

이는 문서가 /proc/$$/environ기만적이라는 것을 의미합니다. 이는 쉘 환경에 대한 변경 사항을 반영하지 않지만 단순히 exec상위 프로세스에서 편집할 때 쉘이 받은 내용을 보고합니다.

답변3

아니요, 거기는 아닙니다.

여기에는 세 가지 "변수" 세트가 있습니다.

  • Bourne Again 셸은 이를 생성하고 실행하는 모든 상위 프로세스로부터 환경 변수 세트를 상속합니다. 이는 수명 내내 Bourne Again 셸 프로세스에 대한 환경 변수로 유지됩니다.
  • 이러한 환경 변수는 두 번째 세트를 초기화합니다.쉘 변수Bourne Again 셸을 사용하면 사용자는 declare.
  • 두 번째 쉘 변수 세트는 어떤 쉘 변수가 사용될지 결정합니다.수출 가능으로 표시execve(및 이 답변의 범위를 벗어나는 일부 다른 메커니즘) 해당 하위 프로세스에서 외부 명령을 실행 하기 위해 Bourne Again 쉘 자체에서 생성된 하위 프로세스에 의해 상속되는 환경 변수는 무엇입니까?

첫 번째 그룹은 "현재 쉘의 환경 변수"입니다. 두 번째 그룹은껍데기변수, 세 번째 그룹은 환경 변수입니다.하위 프로세스의.

Bourne Again 쉘은 프로세스 환경 변수를 변경하고 해당 변경 사항을 다른 프로세스에 표시할 수 있지만, 제가 설명했듯이 프로그램은 다음과 같은 작업을 수행할 수 있습니다.https://unix.stackexchange.com/a/432681/5132, 실제로 Bourne Again 쉘은 이를 수행하지 않습니다.

마찬가지로 Bourne Again 셸은 환경 변수에 대한 액세스를 제공할 수 있지만 그렇지 않고 환경 변수에 대한 액세스만 제공합니다.껍데기변하기 쉬운~에서쉘 프로그램이 시작될 때 해당 환경 변수.

(이 질문 때문에 Bourne Again 쉘을 언급했지만 실제로 대부분의 쉘은 비슷하게 작동하며 이는 Bourne Again 쉘에만 국한된 것이 아닙니다.)

물론 외부 프로그램은 세 번째 변수 세트를 좋아 env하고 표시합니다.printenv

현재 셸 프로세스의 환경 변수를 보려면 외부 명령을 사용해야 합니다.

PS ewwww -p $$
또는

hexdump -C /compat/linux/proc/$$/environ
( /procLinux 운영 체제에만 해당)

추가 읽기

답변4

declare -p나열됩니다모든 것것 같다. "환경 변수"는 로컬 쉘 변수를 내보내는 것이 아니라 기술적으로 내보낸 변수이기 때문에 귀하의 질문은 약간 오해의 소지가 있습니다.

관련 정보