다른 명령으로 파이프할 때 변수를 설정하지 않고 내보내기

다른 명령으로 파이프할 때 변수를 설정하지 않고 내보내기

bash 3.2를 사용하여 다른 명령으로 내보내기를 파이핑하면 변수가 변경되지 않습니다.

export USER=new | cat ; env | grep USER

산출:USER=old

User 변수는 변경되지 않고 동일하게 유지됩니다. 그러나 내보내기가 성공적으로 종료되었습니다. 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

관련 정보