Jak rozumieć polecenie „cat> nazwa_pliku << bla”?


13

W poniższym poleceniu cat pobiera zawartość here-doc i przekierowuje ją do pliku o nazwie conf:

cat > conf << EOF
var1="cat"
var2="dog"
var3="hamster"
EOF

Jak zrozumieć kolejność poleceń tutaj? Czy bashnajpierw przetwarza wszystko inne (część doc tutaj) i jako ostatni krok wygląda na > confczęść?

Odpowiedzi:


17

Dokument tutaj jest rodzajem przekierowania powłoki, więc powłoka wykona ją jak normalne przekierowanie, od początku do końca (lub od lewej do prawej, lub kolejności wyświetlania). Jest to zdefiniowane przez POSIX:

Jeśli polecenie zawiera więcej niż jednego operatora przekierowania, kolejność obliczeń jest od początku do końca.


W twoim poleceniu catwykonasz > confnajpierw, otwórz i obcię confplik do zapisu, a następnie odczyta dane Here-Document.

Za pomocą stracemożesz to zweryfikować:

$ strace -f -e trace=open,dup2 sh -c 'cat > conf << EOF
var1="cat"
var2="dog"
var3="hamster"
EOF
'
...
open("conf", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
dup2(3, 1)                              = 1
dup2(3, 0)                              = 0
...

Widzę. Więc w zasadzie, co dzieje się w przypadku cat > file_name << blahjest to, że przed wykonaniem catna stdout skorupy jest podłączony do pliku o nazwie file_namea następnie stdin powłoki jest połączony tutaj-doc ?
Martin

@Martin: Tak. Widać openbyło wcześniej dup2.
cuonglm

12

Cóż, dowiedzmy się:

unset file
cat >"$file" <<EOF
this is not in ${file=./myfile}
EOF

bash: : No such file or directory

Dang. Wydaje mi się, że najpierw trzeba wykonać tę >"$file"część. Ale co gdyby...?

unset file
<<EOF cat >"$file"
this is in ${file=./myfile}
EOF

...żaden błąd...?

cat ./myfile

this is in ./myfile

Jak się wydaje, kolejność ma znaczenie.


-1

Podczas bashtworzenia procesu do uruchomienia cat, otwiera się on confdo zapisu na deskryptorze pliku 1 i otwiera plik tymczasowy (dla dokumentu tutaj) do odczytu na deskryptorze pliku 0, przed execuruchomieniem programu. W tym przypadku tak naprawdę nie ma znaczenia, w jakiej kolejności są wykonywane te działania.

Kolejność staje się znacząca, gdy deskryptory plików zostaną ponownie przypisane, np 2>&1. Za pomocą .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.