제 스크립트의 목적 은 file
.wc
내 터미널에서 실행되는 스크립트:
C=0; cat file | while read line ; do C=$[ $C + 1 ] ; done ; echo $C
나는 항상 변수를 0
초기화하는 숫자나 무엇이든 얻습니다.C
내 교과서에서는 각 파이프에 대해 모든 부모 변수를 상속하는 새로운 자식 프로세스가 생성되지만 자식이 죽으면 아버지는 여전히 이전 값을 "본다"고 이 동작을 설명합니다. 나는 동의한다.
C=0; cat file
내가 이해하지 못하는 것은 과 사이에 하나의 파이프만 보인다는 것입니다 while read line ; do C=$[ $C + 1 ] ; done ; echo $C
. 그러면 두 번째 부분 echo
도 자식에 의해 실행되는 것 같은데 왜 잘못된 값이 인쇄되는 걸까요? C
동일한 파이프에 속하므로 자식이 변수를 증가시키고 올바른 값을 인쇄하면 안 되나요 ?
답변1
C=0; cat file
내가 이해하지 못하는 것은 과 사이에 하나의 파이프만 보인다는 것입니다while read line ; do C=$[ $C + 1 ] ; done ; echo $C
.
아니요, 그렇게 해석되지 않습니다. 실제로 세 개의 "파이프"가 있습니다.
C=0
cat file | while read line ; do C=$[ $C + 1 ] ; done
echo $C
(물론 첫 번째와 세 번째는 퇴화된 단일 명령 파이프라인이지만 기술적으로는 여전히 그렇습니다. 파이프라인은의 순서하나 이상명령은 제어 연산자 "|"로 구분됩니다.)
즉, 첫 번째와 마지막 세미콜론은 파이프를 구분합니다. 그 사이에 있기 while
때문에done
while
복합 명령.
복합 명령이 없는 간단한 예:
$ echo hello | tr a-z x ; echo you | tr a-z y
xxxxx
yyy
hello
여기서 우리는 첫 번째 항목으로만 이동 tr
하고 you
두 번째 항목, 즉 세미콜론으로 구분된 파이프로만 이동한다는 것을 쉽게 알 수 있습니다 tr
.
질문내 변수가 하나의 "읽는 동안" 루프에서는 로컬이지만 겉보기에 유사한 다른 루프에서는 로컬이 아닌 이유는 무엇입니까?C
루프에서 업데이트된 값을 출력할 수 있도록 수행하려는 작업을 수행하기 위한 여러 메서드가 포함되어 있습니다 .