이 맥락에서 "읽다"는 무엇입니까?

이 맥락에서 "읽다"는 무엇입니까?

고려하면:

cat filename | while read i
do
    echo $i
done

다른 모든 답변은 실패했습니다. 이것은 작동합니다! 그러면 텍스트 파일이 한 줄씩 잘립니다.
주요 부분에 대해 더 알고 싶습니다.읽다. 그런데 소스코드를 찾을 수 없습니다. which read출력이 없습니다. 이 맥락에서 "읽다"는 무엇입니까?

답변1

이것은 작동합니다

그렇지 않다. 해당 행은 read쉘 규칙에 따라 구문 분석되고 재구성됩니다 . 예를 들어,

echo '  hello  world  ' |
    ( read x; echo ">$x<" )

캡처된 내용에는 $x선행 또는 후행 공백이 없습니다.

>hello  world<

(결과를 변경 read x하여 IFS= read -r x비교합니다.) 또한 변수를 큰따옴표 없이 사용하면 $x추가 처리됩니다. 예를 들어,

touch a b c    # Create three empty files
x='here is my star: *'

echo "$x"      # Outputs: here is my star: *
echo $x        # Outputs: here is my star: a b c

귀하의 경우, 파일은 a현재 b디렉토리 c의 파일 세트로 보완됩니다. ( touch부작용으로 빈 파일만 생성된다는 점을 지적해야 합니다 . 파일이 이미 존재하는 경우 마지막 수정 시간만 업데이트됩니다.지금그리고 절대로 잘리거나 다시 생성되지 않습니다. )

결국 $x루프가 서브쉘에 있기 때문에 루프 외부의 값을 사용할 수 없게 됩니다. ( x='demo'루프가 시작되기 전에 설정한 다음 echo "$x"루프가 끝난 후에 설정합니다. 루프의 영향을 받지 않습니다.) 이 경우 cat파일이 하나뿐이므로 그럴 필요가 없습니다.

while IFS= read -r x
do
    printf '%s\n' "$x"
done <filename

그러나 그렇더라도 많은 도구가 어쨌든 파일을 한 줄씩 처리하므로 일반적으로 이와 같이 입력을 반복할 필요가 없습니다. 비교하다

cat filename

답변2

이것은 read쉘 내장 명령입니다.POSIX에 의해 지정됨. Bash 구현은 다음과 같습니다.Bash 매뉴얼에 설명되어 있음, 그 소스 코드는 다음과 같습니다Bash 저장소의 일부.

관련 정보