내보내기는 다른 명령으로 전달할 때 변수를 설정하지 않습니다.

내보내기는 다른 명령으로 전달할 때 변수를 설정하지 않습니다.

파이프를 통해 다른 명령으로 내보낼 때(bash 3.2 사용) 이 변수는 변경되지 않습니다.

export USER=new | cat ; env | grep USER

산출:USER=old

사용자 변수는 변경되지 않고 그대로 유지됩니다. 그러나 내보내기는 성공적으로 종료됩니다. export USER=new | echo $?출력 0.

답변1

일반적으로 파이프라인의 각 섹션(일부 셸의 마지막 섹션 제외)은 하위 셸에서 실행됩니다. 즉, 셸은 각 섹션에 대해 자체 복사본을 생성하고 각 복사본은 해당 섹션의 명령을 처리하고 외부 명령을 실행합니다( 거기 처럼 cat). 변경된 값은 다음 명령(다른 파이프)을 계속 실행하는 기본 셸에 표시되지 않습니다.

( 어쨌든 var이와 같은 명령 뒤에 어떤 값이 나타날 것이라고 예상하십니까 var=foo | var=bar?)

일반적으로 이는 파이프라인의 마지막 부분에서 변수 할당을 수행할 때 발생합니다.

n=0
some command | while read line; do n=$((n+1)); done

n많은 셸에서 이는 설정을 유지 0하지만 전부는 아닙니다. ksh 및 zsh는 기본 셸의 마지막 부분을 실행하고 Bash에는 옵션이 있습니다. 이에 대해서는 다음에서 논의됩니다.내 변수가 하나의 "읽는 동안" 루프에서는 로컬이지만 겉보기에 유사한 다른 루프에서는 로컬이 아닌 이유는 무엇입니까?.

답변2

다음과 같이 코드를 다시 작성하십시오.

export USER=new
env | grep $USER

USER이전에 필요한 변수 내용을 얻으려면 $. 명령에 STDOUT에 대한 출력이 없으므로 export파이프를 열어도 소용이 없습니다 .export

관련 정보