web-dev-qa-db-ja.com

read -rの意味は何ですか?

別の答えを理解するために:

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

最初のステップは、読み取りコマンドのオプション-rの使用法を理解することです。

まず、私は単に実行するだけで十分だと思いました

man read

-rオプションの意味を調べるために、manページにオプションの説明がまったく含まれていないことに気付いたので、いくつかのread -t、read -pの例がありますが、read -rはありませんでした。

25
Abdul Al Hazred

スタンドアロンのreadコマンドはありません。代わりに、組み込みのシェルであり、bashのマニュアルページに記載されています。

read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p
Prompt] [-t timeout] [-u fd] [name ...]
[...]
       -r     Backslash does not act as an escape character.  The back‐
              slash is considered to be part of the line.  In  particu‐
              lar,  a  backslash-newline pair may not be used as a line
              continuation.

したがって、要約すると、readは通常、末尾のバックスラッシュ文字を使用して長い行を改行することを許可し、通常はそのような行を再構築します。この少し意外な動作は、-rを使用して無効にすることができます。

28
dhag

-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
4
aderchox

Bashのmanページのreadに関するセクションには、デフォルトで...

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

ただし、-rを渡すと

バックスラッシュはエスケープ文字として機能しません。バックスラッシュは行の一部と見なされます。特に、バックスラッシュと改行のペアを行の継続として使用することはできません。

少し考えてみると、彼らが話している可能性のある唯一の「特別な意味」は、区切り文字として機能する文字であることが示唆されています。そして確かに、なし-r、区切り文字または改行をバックスラッシュでエスケープできますが、with-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 var1 <<< 'There was once \
a curious Uni\x user.xHe did a little test.'
$ echo "$var1"
There was once \
a curious Uni\
0
Mark Amery