read -r 是什么意思?

read -r 是什么意思?

为了理解另一个答案(格伦·杰克曼):

find / -type d -print0 | while read -r -d '' dir; do ls -ltr "$dir" | sed '$!d'; done

第一步是了解命令-r的选项的用法read

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

man read

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

答案1

没有独立的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

答案2

-r防止反斜杠转义被解释。这是一个例子:

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

ngRTM6hNqgziZcqCcEJN7bHAP9a1GeMs\
Ni3EAX1qvogWpRIPE3oagJL6nwl\QQW9y
bjJHyaVBrUcyZOY5U4h9QHnpEPqg\\\\\\\\\Q9Fk
iNOvAyBTAcN5n1uwR4GvRfAGUbPWiXax\n
cqGPPStH3gaWolrfVAlMtoWiSuLa7GzQ\n\n\n
EnO04N1nEkpWbfXRxrtYNqCZDpF\trQIXS
$ while read line; do echo $line; done < tempfile
ngRTM6hNqgziZcqCcEJN7bHAP9a1GeMsNi3EAX1qvogWpRIPE3oagJL6nwlQQW9y
bjJHyaVBrUcyZOY5U4h9QHnpEPqg\\\\Q9Fk
iNOvAyBTAcN5n1uwR4GvRfAGUbPWiXaxn
cqGPPStH3gaWolrfVAlMtoWiSuLa7GzQnnn
EnO04N1nEkpWbfXRxrtYNqCZDpFtrQIXS
$ while read -r line; do echo $line; done < tempfile
ngRTM6hNqgziZcqCcEJN7bHAP9a1GeMs\
Ni3EAX1qvogWpRIPE3oagJL6nwl\QQW9y
bjJHyaVBrUcyZOY5U4h9QHnpEPqg\\\\\\\\\Q9Fk
iNOvAyBTAcN5n1uwR4GvRfAGUbPWiXax\n
cqGPPStH3gaWolrfVAlMtoWiSuLa7GzQ\n\n\n
EnO04N1nEkpWbfXRxrtYNqCZDpF\trQIXS

答案3

Bash 手册页的部分aboutread指出,默认情况下...

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

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

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

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

$ read -d 'x'    var1 <<< 'There was once \
a curious Uni\x user.xHe did a little test.'
$ echo "$var1"
There was once a curious Unix user.
$ read -d 'x' -r var2 <<< 'There was once \
a curious Uni\x user.xHe did a little test.'
$ echo "$var2"
There was once \
a curious Uni\

相关内容