Как понять команду «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
...
cuonglm
источник
Понимаю. Поэтому в основном то , что происходит в случае cat > file_name << blahявляется то , что перед выполнением catна стандартный вывод из оболочки связан с файл с именем , file_nameа затем стандартный ввод оболочки подключается к здесь-документ ?
Мартин
@ Мартин: Да. Вы видите, openбыл вызван раньше dup2.
Cuonglm
12

Что ж, давайте выясним:

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

bash: : No such file or directory

Dang. Я предполагаю, что это должно делать >"$file"роль сначала тогда. А вдруг...?

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

...Нет ошибок...?

cat ./myfile

this is in ./myfile

Как оказалось, порядок имеет значение.

mikeserv
источник
-1

Когда bashсоздается процесс для запуска cat, он открывается confдля записи в файловый дескриптор 1 и открывает временный файл (для данного документа) для чтения в файловом дескрипторе 0 перед execначалом работы с программой. В этом случае не имеет значения, в каком порядке происходят эти действия.

Порядок становится значимым, когда файловые дескрипторы переназначаются, например, с 2>&1.

Тоби Спейт
источник