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。代わりに組み込みシェルなので、マニュアルページに記載されています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

バッシュのマニュアルページ部分aboutはread基本的に以下を指摘しています。

バックスラッシュ文字(\)は、次の文字の読み取りと行の連続の特別な意味を削除するために使用できます。

しかし、合格する-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\

関連情報