read -r은 읽기의 드문 특수 사용 사례에만 사용됩니까?

read -r은 읽기의 드문 특수 사용 사례에만 사용됩니까?

~에 따르면이 설명서 -r을 위한 read:

백슬래시로 문자를 이스케이프할 수 없습니다.

내가 아는 한, 일반적으로 read쉘 내장 기능은 입력을 받아 해당 입력을 다음과 같이 보관하는 변수를 생성합니다.여기서 백슬래시는 문자 그대로의 구성 요소일 뿐이며 어쨌든 어떤 것도 이스케이프하지 않습니다.

read -r드물고 특수한 사용 사례 에만 해당됩니다 read(출력의 공통 분모는와는 별개로문자열)?

답변1

내가 아는 한, 일반적으로 읽기 셸 내장 함수는 입력을 받아 해당 입력을 문자열로 유지하는 변수를 생성합니다. 여기서 백슬래시는 리터럴 구성 요소일 뿐이며 어쨌든 아무것도 이스케이프되지 않습니다.

일반적으로 입력이 주어지면 문자열 에 read var아무것도 저장되지 않습니다 . 백슬래시를 이스케이프 뒤의 문자로 처리하고 백슬래시를 제거합니다. 그것을 얻으려면 입력해야합니다 .-rfoo\barvarfoobarfoo\\barfoo\bar

read다음과 같이 여러 값을 읽는 데 사용할 수 있습니다.

$ read a b <<< 'xx yy'; echo "<$a> <$b>"
<xx> <yy>

( <<<명령에 대한 입력으로 제공되는 다음 문자열인 "here-string"입니다.)

문자를 IFS구분 기호로 사용하므로 기본적으로 공백입니다. 백슬래시를 사용하면 이러한 구분 기호를 이스케이프 처리하여 일반 문자로 만들고 백슬래시를 제거할 수 있습니다(백슬래시가 일반 문자 앞에 나타나는 경우에도 마찬가지입니다). 그래서 당신은 얻을 것입니다:

$ read a b <<< 'xx\ yy'; echo "<$a> <$b>"
<xx yy> <>
$ read a b <<< 'xx\n yy'; echo "<$a> <$b>"
<xxn> <yy>

구분 기호를 이스케이프 처리하는 것은 거의 유용하지 않으며 누군가가 C 스타일 문자 이스케이프를 사용하여 문자열을 입력하려는 경우 백슬래시를 제거하는 것도 성가신 일이 될 수 있습니다.

또한 후행 백슬래시는 readC 및 셸에서 연속 행이 작동하는 방식과 유사하게 첫 번째 행의 연속으로 다른 행이 읽힐 때까지 기다립니다.

의 경우 read -r백슬래시는 일반 문자입니다.

$ read -r a b <<< 'value\with\backslashes\ yy'; echo "<$a> <$b>"
<value\with\backslashes\> <yy>

많은 사용 사례에서 백슬래시는 사용자가 입력할 것으로 예상되는 것이 아니며, 백슬래시가 없으면 read -r일반 과 ​​동일 합니다 read. 그러나 누군가가 백슬래시를 입력해야 하는 경우 백슬래시를 사용하면 read -r관련된 놀라움을 줄일 수 있습니다. 따라서 read(프로그램에서 할당할 수 있는 특별한 속성 외에도) 특별해지기를 정말로 원하지 않는 한 이를 사용해도 괜찮을 것입니다 .

관련 정보