제목에서 알 수 있듯이 저는 하위 프로세스(보통 스크립트)에서 상위 프로세스(특히 셸)의 환경 변수를 변경할 수 있기를 원합니다. 의사 터미널의 하위 스크립트에서 내보내려고 /dev/pts/id
하므로 key=value
내보낸 변수를 어떻게든 상위 스크립트에 전달해야 합니까(가능한 경우)?
에코잉은 cmd > /proc/$$/fd/0
실행되지 않으며 , 서브셸에서 실행 하는 대신 cmd
셸 터미널 에뮬레이터에서 명령을 보기만 하며 상위 프로세스에 변수를 추가하지 않습니다.$(cmd)
cmd
export
나는 모든 작업이 하위 측에서 수행되는 것을 선호합니다.
누군가 댓글에서 나에게 물었습니다. 내가 달성하고 싶은 것은 무엇입니까? 이것은 일반적인 질문이며 사용자가 추가 작업 없이 추가된 변수의 이점을 누릴 수 있도록 (부모) 셸에서 실행(생성)된 스크립트에 변수를 전달하기 위해 긍정적인 대답을 사용하려고 합니다. 예를 들어, 응용 프로그램을 설치하는 스크립트를 원하고 응용 프로그램 디렉터리를 상위 셸 경로에 추가해야 합니다.
답변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)