读-r是什么意思?

Abd*_*red 42 shell read

为了理解另一个答案(由 glenn jackman):

find / -type d -print0 | while read -r -d '' dir; do ls -ltr "$dir" | sed '$!d'; done
Run Code Online (Sandbox Code Playgroud)

第一步骤是要了解该选项的使用-r的的read命令。

首先,我想,简单地执行就足够了

man read
Run Code Online (Sandbox Code Playgroud)

查找-r选项的含义,但我意识到手册页根本不包含任何对选项的解释,所以我搜索了它。我得到了一些read -tread -p例子,但是没有read -r

dha*_*hag 47

没有独立的read命令:相反,它是一个内置的 shell,因此在手册页中记录了以下内容bash

read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]

    ?????
    -r
      反斜杠不充当转义字符。反斜杠被认为是行的一部分。特别是,反斜杠-换行符对不能用作换行符。

因此,总而言之,read通常允许使用尾随反斜杠字符断开长行,并通常重建这些行。可以使用 停用这种稍微令人惊讶的行为-r

  • 演示:`str="a\bc"; 读 x <<< "$str"; 读 -ry <<< "$str"; 回声“$x”;回声“$y”` (14认同)

ade*_*hox 12

-r选项可防止解释反斜杠转义。下面是一个例子:

假设有一个包含以下内容的文件:

ngRTM6hNqgziZcqCcEJN7bHAP9a1GeMs\
Ni3EAX1qvogWpRIPE3oagJL6nwl\QQW9y
bjJHyaVBrUcyZOY5U4h9QHnpEPqg\\\\\\\\\Q9Fk
iNOvAyBTAcN5n1uwR4GvRfAGUbPWiXax\n
cqGPPStH3gaWolrfVAlMtoWiSuLa7GzQ\n\n\n
EnO04N1nEkpWbfXRxrtYNqCZDpF\trQIXS
Run Code Online (Sandbox Code Playgroud)
$ while read line; do echo $line; done < tempfile
ngRTM6hNqgziZcqCcEJN7bHAP9a1GeMsNi3EAX1qvogWpRIPE3oagJL6nwlQQW9y
bjJHyaVBrUcyZOY5U4h9QHnpEPqg\\\\Q9Fk
iNOvAyBTAcN5n1uwR4GvRfAGUbPWiXaxn
cqGPPStH3gaWolrfVAlMtoWiSuLa7GzQnnn
EnO04N1nEkpWbfXRxrtYNqCZDpFtrQIXS
Run Code Online (Sandbox Code Playgroud)
$ while read -r line; do echo $line; done < tempfile
ngRTM6hNqgziZcqCcEJN7bHAP9a1GeMs\
Ni3EAX1qvogWpRIPE3oagJL6nwl\QQW9y
bjJHyaVBrUcyZOY5U4h9QHnpEPqg\\\\\\\\\Q9Fk
iNOvAyBTAcN5n1uwR4GvRfAGUbPWiXax\n
cqGPPStH3gaWolrfVAlMtoWiSuLa7GzQ\n\n\n
EnO04N1nEkpWbfXRxrtYNqCZDpF\trQIXS
Run Code Online (Sandbox Code Playgroud)


Mar*_*ery 5

Bash 手册页的有关部分read,默认情况下......

\n
\n

反斜杠字符\n(\\ ) 可用于删除下一个读取字符的任何特殊含义,\xc2\xa0 用于删除行继续。

\n
\n

但是,如果你通过了-r,那么

\n
\n

反斜杠不充当转义字符。\xc2\xa0\n反斜杠被视为\xc2\xa0是\xc2\xa0行的一部分。\xc2\xa0\n特别是,反斜杠-换行符对不能用作a\xc2\xa0 行延续。

\n
\n

稍微思考一下,他们可能谈论的唯一可能的“特殊含义”是充当分隔符的字符。果然,如果没有 -r,您可以反斜杠转义分隔符或换行符,但是使用 -r,则不能,并且反斜杠只会被解释为文字反斜杠:

\n
$ read -d \'x\'    var1 <<< \'There was once \\\na curious Uni\\x user.xHe did a little test.\'\n$ echo "$var1"\nThere was once a curious Unix user.\n$ read -d \'x\' -r var2 <<< \'There was once \\\na curious Uni\\x user.xHe did a little test.\'\n$ echo "$var2"\nThere was once \\\na curious Uni\\
Run Code Online (Sandbox Code Playgroud)\n