Чи можна використовувати декілька тут-документів у bash?


14

Чи можна використовувати декілька тут-документів для надання введення команди в bash?

$ cat <<<foo <<<bar
bar
$ cat <<EOF1 <<EOF2
> foo
> EOF1
> bar
> EOF2
bar

Очевидно, що в обох випадках другий тут-doc використовується як stdin і замінює перше посилання. Чи є рішення echoзамість цього використовувати s?

$ cat <(echo -n foo) <(echo bar)
foobar

Крім того, мені чомусь не вдалося використовувати комбінацію. Чому це було б?

$ cat <<<foo <(echo bar)
bar
$ cat <(echo -n foo) <<<bar
foo

Чи є якась причина, що ви хочете використовувати два тут документи, а не поєднувати їх в один?
квасоля

1
@beans Я насправді натрапив на це під час тестування за pasteдопомогою фіктивних даних. Я думаю, я можу придумати кілька інших сценаріїв. Якби у мене був сценарій із заздалегідь маніпульованим текстом у кількох змінних, я, можливо, захотів би зробити щось обом із командою, яка приймає лише файли, наприклад diff.
Sparhawk

Інший варіант використання (я знайшов це , використовуючи тут-документи , щоб створити сценарій оболонки): ви хочете кілька рядків з підстановкою змінних , а потім деякі рядки без: cat <<EOF1 <<"EOF2".
Toby Speight

Відповіді:


18

Ви можете зробити:

cat /dev/fd/3 3<< E1 /dev/fd/4 4<< E2
foo
E1
bar
E2

Тут може бути лише один stdin, оскільки існує лише один дескриптор файлу 0.

cat << EOF
eof
EOF

скорочено:

cat /dev/fd/0 0<< EOF
eof
EOF

І:

cat <<< foo

є:

cat /dev/fd/0 0<<< foo

Ви повинні вирішити, що відкрити в дескрипторі файлів 0.

cat <(echo foo)

Є:

cat /dev/fd/123

Де 123дескриптор файлу до труби, і паралельно, bash запускається echo fooв іншому процесі, коли stdout перенаправляється на інший кінець труби.

Як тільки ви передасте ім'я файлу cat, catбільше не читайте з stdin. Вам знадобиться:

cat <(echo foo) /dev/fd/0 << EOF
bar
EOF

Або:

cat <(echo foo) - << EOF
bar
EOF

( -це сказати catчитати з stdin).


1
cat <<EOFне зовсім те саме, що cat /dev/fd/0...: в останньому випадку catбачить ім'я файлу і робить відкритим.
Мікель

@Mikel, я мав на увазі те, що він функціонально еквівалентний . Коли не передано жодного аргументу, catзчитується з fd0, ніби передав аргумент -або/dev/fd/0 (хоча в Linux (і лише для Linux), відкриття /dev/fd/0не зовсім схоже на копіювання дескриптора файлу 0).
Стефан Шазелас

Мене дуже здивував /dev/fd/3 3<< E1конструкт, і зараз мені цікаво, що саме є предметами під / dev / fd /. Я хоч якось магічно виглядає після того, як процес відкриває файл десь у файловій системі, за винятком 1 і 2, які за замовчуванням існують для кожного процесу. Але у вашому прикладі ви використовуєте дескриптори файлів 3 і 4, які не підключені до жодного реального файлу, крім цього перенаправлення вводу. Я не можу зрозуміти це в моїй ментальній моделі дескрипторів файлів. Що робити, якщо процес хоче відкрити інший файл, чи знає він, що він повинен використовувати fd 5? У FDS повинні бути 3, 4, 5 .. чи може бути що завгодно?
calavera.info

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