사용자 공간에서 하위 항목에서 상위 항목으로 환경 변수를 전달할 수 있나요? [복사]

사용자 공간에서 하위 항목에서 상위 항목으로 환경 변수를 전달할 수 있나요? [복사]

제목에서 알 수 있듯이 저는 하위 프로세스(보통 스크립트)에서 상위 프로세스(특히 셸)의 환경 변수를 변경할 수 있기를 원합니다. 의사 터미널의 하위 스크립트에서 내보내려고 /dev/pts/id하므로 key=value내보낸 변수를 어떻게든 상위 스크립트에 전달해야 합니까(가능한 경우)?

에코잉은 cmd > /proc/$$/fd/0실행되지 않으며 , 서브셸에서 실행 하는 대신 cmd셸 터미널 에뮬레이터에서 명령을 보기만 하며 상위 프로세스에 변수를 추가하지 않습니다.$(cmd)cmdexport

  1. 나는 모든 작업이 하위 측에서 수행되는 것을 선호합니다.

  2. 누군가 댓글에서 나에게 물었습니다. 내가 달성하고 싶은 것은 무엇입니까? 이것은 일반적인 질문이며 사용자가 추가 작업 없이 추가된 변수의 이점을 누릴 수 있도록 (부모) 셸에서 실행(생성)된 스크립트에 변수를 전달하기 위해 긍정적인 대답을 사용하려고 합니다. 예를 들어, 응용 프로그램을 설치하는 스크립트를 원하고 응용 프로그램 디렉터리를 상위 셸 경로에 추가해야 합니다.

답변1

아니요, 그건 불가능해

일부 없이는 그렇지 않습니다.해결책.

환경 변수는 부모에서 자식으로만(환경 내보내기/상속의 일부로) 전달될 수 있으며 그 반대의 경우는 불가능합니다.

답변2

파일이나 명명된 파이프를 통해 하위 프로세스에서 상위 프로세스로 변수 값을 전송할 수 있습니다.

이것은 가장 간단한 이론적 예입니다.

하위 프로세스:

echo ${variable} >/tmp/file

상위 프로세스:

read variable </tmp/file

답변3

부모 프로세스가 이를 기대하지 않고 협조하지 않는다면 이는 매우 까다로울 수 있습니다. 이 경우에는 다음을 참조하세요.실행 중인 프로세스의 환경 변경 그리고다른 프로세스의 환경 변수를 변경하는 방법이 있습니까?

상위 프로세스에 값이 필요하고 전송에 협력하는 경우 간단한 방법은 명령 대체를 사용하는 것입니다.

출구VAR=$(지침)

이는 변수의 값이 다음과 같다고 가정합니다.오직프로그램이 작성하려는 내용. 자식 프로세스가 화면(특히 부모 프로세스의 표준 출력)에 쓸 수 있어야 하는 경우 부모 프로세스의 파일 설명자 1을 다른 파일 설명자 안에 숨겨 이를 수행할 수 있습니다.

exec 3>&1       # Copy our file descriptor 1 into file descriptor 3.
                # child_prog will be invoked with file descriptor 1 pointing to a pipe
                # for the command substitution, but all other file descriptors intact.
                # Specifically, fd3 will point to our stdout.
export var=$(child_prog)
exec 3>&-       # (Optionally) close fd3 as cleanup.

이제 짧고 간단하다면 child_prog가장 쉬운 방법은 변수의 값을 파일 설명자 1에 쓰고 파일 설명자 3( cmd >&3)을 표준 출력으로 사용하는 것입니다. 규모가 크거나 복잡한 경우 다음을 수행하는 것이 좋습니다.

exec 5>&1       # Redirect fd1 (the command substitution pipe) to fd5.
exec 1>&3       # Set our fd1 (stdout) to our parent's stdout (which was passed in as fd3).
exec 3>&-       # Close fd3; it’s no longer needed.

그러면 stdout이 정상적으로 사용되고 >&5값을 쓰는 데 사용됩니다.

지금까지 나는 변수에 값만 전달하기를 원한다고 가정해 왔습니다. 값이 여러 개인 경우 어떤 값에도 나타나지 않도록 보장되는 문자(또는 문자열)로 구분하세요. 우리가 선택하면 @@부모님은 다음과 같이 말할 수 있습니다.

exec 3>&1
temp=$(child_prog)
exec 3>&-
export var1="${temp%%@@*}"
rest="${temp#*@@}"
export var2="${rest%%@@*}"
export var3="${rest#*@@}"

그리고 아이는 말을 할 수 있어요.echo "value1@@value2@@value3" >&5

어떤 값에도 나타나지 않는 것으로 보장되는 인쇄된 문자열을 찾기 어려운 경우 개행 문자를 사용할 수 있습니다. @@위 명령을 개행 문자로 변경하세요 .

부모:

export var1="${temp%%
*}"
rest="${temp#*
}"
export var2="${rest%%
*}"
export var3="${rest#*
}"

어린이:

printf "%s\n" "값 1" "값 2" "값 3>&5


또 다른 변형은 아이에게 먹이를 주는 것입니다.주문하다 가치관이 아닌 부모에게로 돌아가십시오. 상위 프로세스가 라고 하면 . <(child_prog)하위 프로세스를 실행하고 출력을 캡처합니다.그리고 그것을 실행. 그러면 아이는 할 수 있어요

printf "var1=' 내보내기값 1'\n내보내기 var2='값 2'var3=\"값 3\"\n" >&5

(저는 이것을 테스트했습니다.value3아포스트로피가 포함되어 있으므로 인용해야 했고 \"…\"대체 구문을 설명하기 위해 그대로 두었습니다. )

이 기술의 한 가지 특징은 상위 코드를 변경하지 않고도 내보낼 변수를 추가할 수 있다는 것입니다.

POSIX는 .<(cmd)

관련 정보