NixOS 환경으로 PPID를 내보낼 때 일관되지 않은 동작

NixOS 환경으로 PPID를 내보낼 때 일관되지 않은 동작

PPIDBash에서는 환경 변수로 내보내기를 시도했습니다 . 그러나 제 생각에는 Linux 배포판 전체에서 결과가 매우 일치하지 않습니다.

우분투 18.04에서최대아래 명령은 "예상대로" 작동합니다. NixOS에서는 다음과 같은 동작이 발생합니다.

# normally PPID is not part of the environment
env | grep PPID
# --> no output

# exporting for a single command does not work
PPID=foo some-command
# --> bash: PPID: readonly variable

# exporting "works" (it does not print an error)
export PPID
# and the variable seems to be part of the environment
env | grep PPID
# --> PPID=12345
awk 'BEGIN{print ENVIRON["PPID"]; exit}'
# --> 12345
# but some external commands don't see it!
python -c 'import os; print(os.environ.get("PPID"))'
# --> None on NixOS // 12345 on Ubuntu
nvim --headless -u NONE -i NONE -c 'echo $PPID' -c quit
# --> *no output* (on NixOS and Ubuntu)

# using env to export it explicitly, so bash will not complain,
# "works" as good as `export PPID` above, but does not produce 
# the "readonly variable" error message
env PPID=foo awk 'BEGIN{print ENVIRON["PPID"]; exit}'
# -> foo
env PPID=foo python -c 'import os; print(os.environ.get("PPID"))'
# --> None // foo on Ubuntu

환경 변수의 이름을 다른 것으로 변경하면(bash에서는 특별한 것이 아닙니다) PARENT_PROCESS배포판과 테스트하는 모든 명령에서 예상대로 작동합니다.

무슨 일인지 설명해 줄 수 있는 사람 있나요?


NixOS 버전이 불안정합니다( 21.03pre244045.1179840f9a8 (Okapi)).

  • 배쉬: GNU bash, version 4.4.23(1)-release (x86_64-unknown-linux-gnu)에서/nix/store/xadrr3l5jvkkm3g3lb2g81j5wz51zqdv-bash-interactive-4.4-p23/bin/bash
  • 도서관:/nix/store/9df65igwjmf2wbw0gbrrgair6piqjgmi-glibc-2.31/lib/libc-2.31.so

Ubuntu 18.04 버전:

  • bash: GNU bash, version 4.4.20(1)-release (x86_64-pc-linux-gnu)패키지 bash버전 에서4.4.18-2ubuntu1.2
  • libc:2.27(패키지 libc6버전에서)2.27-3ubuntu1.2

답변1

PPID변수는 상위 프로세스 ID의 값을 반영하는 특수 쉘 변수(환경 변수가 아님)입니다. 값을 환경으로 내보낼 수 있지만 하위 쉘로 전달되면 하위 쉘은 새 PPID쉘 변수를 생성하고 PPID하위 프로세스로 내보낼 변수 목록에서 이를 제거합니다.

다양한 운영 체제나 배포판 간의 동작 차이는 일부 운영 체제나 배포판에서는 하위 프로세스가 래퍼 쉘 스크립트를 통해 호출되지만 다른 운영 체제에서는 그렇지 않다는 사실로 설명할 수 있습니다. 래퍼 스크립트를 사용하면 중간 셸이 PPID환경에서 제거되지만 최종 프로세스(Python 또는 nvim)가 직접 실행되면 PPID변수는 여전히 환경에 남아 있습니다.

관련 정보