为了理解另一个答案(格伦·杰克曼):
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\