고려하면:
- https://linuxcommand.org/lc3_man_pages/readh.html
- https://man7.org/linux/man-pages/man2/read.2.html
- https://git.savannah.gnu.org/cgit/coreutils.git/tree/src
- https://stackoverflow.com/a/60869467/15603477
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 저장소의 일부.