Jakie jest znaczenie read -r?

21

aby zrozumieć inną odpowiedź:

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

Pierwszym krokiem jest zrozumienie użycia opcji -r polecenia read.

Po pierwsze, pomyślałem, że wystarczy po prostu wykonać

man read

żeby sprawdzić znaczenie opcji -r, ale zdałem sobie sprawę, że strona podręcznika w ogóle nie zawiera żadnego wyjaśnienia opcji, więc przejrzałam go, otrzymując kilka przykładów odczytu -t, odczytu -p, ale brak odczytu -r.

Abdul Al Hazred
źródło
Mówisz, że nie ma strony podręcznika do przeczytania? Po wpisaniu man read otrzymuję długą listę poleceń wbudowanych w Bash. Szukałem za pomocą „/ read” Umieściłem to, co widziałem tutaj pastebin.com/raw.php?i=tZ1uUXrG
user610209
1
Jest to powłoka wbudowana (przynajmniej w bash) - spróbuj help readlubman bash
steeldriver
Jeśli chodzi o twoje tytułowe pytanie, przeczytaj unix.stackexchange.com/questions/18886/...
Gilles „SO- przestań być zły”
READ(1P)istnieje dla mnie ...
jasonwryan

Odpowiedzi:

27

Nie ma osobnego readpolecenia: jest to wbudowana powłoka i jako taka jest udokumentowana na stronie podręcznika dla 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.

Podsumowując, readnormalnie pozwala na łamanie długich linii za pomocą znaku odwrotnego ukośnika i zwykle rekonstruuje takie linie. To nieco zaskakujące zachowanie można wyłączyć za pomocą -r.

dhag
źródło
10
Demo:str="a\bc"; read x <<< "$str"; read -r y <<< "$str"; echo "$x"; echo "$y"
glenn jackman
@glennjackman To wspaniale, jeszcze bardziej uderzające, jeśli wpiszesz str="a` and then hit Enter before pasting in the rest of the command starting with b`.
ErikE
1

Ta -ropcja zapobiega interpretacji ucieczek odwrotnego ukośnika . Oto przykład:

Załóżmy, że istnieje plik z tą zawartością:

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
aderchox
źródło