read에는 내장 변수 $REPLY가 있는데 왜 $line이나 다른 변수를 명시적으로 선언해야 합니까?

read에는 내장 변수 $REPLY가 있는데 왜 $line이나 다른 변수를 명시적으로 선언해야 합니까?

한 줄씩 읽고 IFS를 null로 설정하면 다음과 같이 작성할 수 있습니다.

while IFS= read -r line
do
    echo "$line"
done < <(find . -name "*.txt")

이는 다음과 동일하지 않습니다.

while read -r
do
    echo "$REPLY"
done < <(find . -name "*.txt")

왜 또는 언제 하나가 다른 것보다 선호됩니까?

답변1

line기본 변수 대신 명명된 변수를 사용하는 이유는 무엇입니까 REPLY?

코드가 수행하는 작업을 설명하는 방식으로 변수 이름을 지정하면 코드를 이해하는 데 도움이 됩니다. 비교하다:

files=( ... )
target=...
for file in "${files[@]}"; do
    something "$file" "$target"
done

그리고

a=( ... )
b=...
for c in "${a[@]}"; do
    something "$b" "$c"
done

어느 것이 더 명확합니까? 버그가 있는 경우 어떤 버그를 더 쉽게 찾을 수 있나요?

답변2

에서 man bash,If no names are supplied, the line read is assigned to the variable REPLY.두 번째 시도에서는 이름이 없으므로 기본적으로 REPLY 변수에 저장됩니다.

예:

$ cat infile
1
2
3

$ while read ; do echo $REPLY; done <infile
1
2
3

REPLY그러나 이름을 지정하면 해당 변수(변수)가 설정되지 않으며 이 경우 현재 줄은 지정된 이름으로 읽혀집니다.

$ while read tmp; do echo $REPLY; done <infile



$

왜 또는 언제 하나가 다른 것보다 선호됩니까?

그것은 분명합니다. 기본 REPLY 변수를 사용하여 읽은 행을 저장하려면 제거하는 것은 귀하에게 달려 있습니다.이름다른 변수 이름에 저장되는 매개변수는 엄격하게 지정하면 됩니다.

관련 정보