Як зрозуміти команду “cat> file_name << blah”?


13

У наступній команді cat приймає вміст here-doc і перенаправляє його у файл з назвою conf:

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

Як тут зрозуміти порядок команд? Чи bashспочатку обробляє все інше (тут-частина документа), і як завершальний крок це виглядає > conf?

Відповіді:


17

Here-Document - це різновид перенаправлення оболонки, тому оболонка буде виконувати це як звичайне перенаправлення, від початку до кінця (або зліва направо, або порядку появи). Це визначено POSIX:

Якщо командою вказано більше одного оператора перенаправлення, порядок оцінки працює від початку до кінця.


У вашій команді catбуде виконуватися > confспочатку, відкривати і усікати confфайл для запису, а потім читати дані з Here-Document.

Використовуючи strace, ви можете перевірити це:

$ 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
...

Я бачу. Тому в основному те , що відбувається в разі cat > file_name << blahє те , що перед виконанням catна стандартний висновок з оболонки пов'язаний з файл з ім'ям , file_nameа потім стандартний ввід оболонки підключається до тут-документ ?
Мартін

@Martin: Так. Ви можете бачити, openяк називали раніше dup2.
cuonglm

12

Що ж, давайте з’ясуємо:

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

bash: : No such file or directory

Данг. Я здогадуюсь, то >"$file"спочатку треба це робити . Але що робити, якщо ...?

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

... без помилок ...?

cat ./myfile

this is in ./myfile

Як виявляється, замовлення має значення.


-1

Коли bashпроцес створюється для запуску cat, він відкривається confдля запису на дескриптор 1 файлу та відкриває тимчасовий файл (для документа тут) для читання в дескрипторі 0 файлів перед execпочатком програми. У цьому випадку не дуже важливо, в якому порядку відбуваються ці дії.

Порядок стає значущим, коли дескриптори файлів переназначаються, наприклад, з 2>&1.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.