Как объединить замену процесса Bash со ЗДЕСЬ-ДОКУМЕНТОМ?

Попытайтесь нажать хитрость "End", показывающую логотип для наблюдения, где это останавливается так, у нас может быть лучшая идея о том, что сделать затем, но xorg.log мог бы сказать Вам что-то также.

14
17.06.2014, 03:49
3 ответа

Замена процесса примерно эквивалентна этому.

Пример - механика процессной замены

Шаг #1 - сделайте пятёрку, выводите на неё

$ mkfifo /var/tmp/fifo1
$ fmt --width=10 <<<"$(seq 10)" > /var/tmp/fifo1 &
[1] 5492

Шаг #2 - читайте пятёрку

$ cat /var/tmp/fifo1
1 2 3 4
5 6 7 8
9 10
[1]+  Done                    fmt --width=10 <<< "$(seq 10)" > /var/tmp/fifo1

Использование парен внутри HEREDOC тоже кажется нормальным:

Пример - просто используя FIFO

Шаг #1 - выводите на FIFO

$ fmt --width=10 <<FOO > /var/tmp/fifo1 &
(one)
(two
FOO
[1] 10628

Шаг #2 - читайте содержимое FIFO

$ cat /var/tmp/fifo1
(one)
(two

Проблема, на мой взгляд, заключается в том, что процессная замена, <(... ...), похоже, не заботится о вложенности парней внутри нее.

Пример - подстановка процесса + HEREDOC не работает

$ cat <(fmt --width=10 <<FOO
(one)
(two
FOO
)
bash: bad substitution: no closing `)' in <(fmt --width=10 <<FOO
(one)
(two
FOO
)
$

Похоже, что уход от парен успокаивает, немного:

Пример - уход от парен

$ cat <(fmt --width=10 <<FOO                 
\(one\)
\(two
FOO
)
\(one\)
\(two

Но на самом деле не дает вам того, что вы хотите. Сделать пары сбалансированными, кажется, также успокаивает:

Пример - балансировка парен

$ cat <(fmt --width=10 <<FOO
(one)
(two)
FOO
)
(one)
(two)

Всякий раз, когда у меня есть сложные строки, такие как эта, чтобы соперничать в Bash, я почти всегда буду сначала их строить, сохраняя в переменной, а затем использовать их через переменную, вместо того, чтобы пытаться создать какой-нибудь хитрый лайнер, который в итоге окажется хрупким.

Пример - используйте переменную

$ var=$(fmt --width=10 <<FOO
(one)
(two
FOO
)

Затем распечатайте ее:

$ echo "$var"
(one)
(two

Ссылки

7
27.01.2020, 19:51

Это просто обходной путь. Pipe fmt to cat вместо использования подстановки процесса

fmt --width=10 <<FOOBAR | cat 
(I want the surrounding parentheses to be part of the HERE-document)
(Even the preceding unbalanced parenthesis should be part of it.
FOOBAR
3
27.01.2020, 19:51

Это старый вопрос, и когда вы понимаете, что это надуманный пример (и, следовательно, правильным решением будет использование cat | или вообще никакого cat в этом case), я просто отправлю свой ответ для общего случая. Я бы решил это, поместив его в функцию и используя вместо этого.

fmt-func() {
    fmt --width=10 <<FOOBAR
(I want the surrounding parentheses to be part of the HERE-document)
(Even the preceding unbalanced parenthesis should be part of it.
FOOBAR
}

, а затем используйте это

cat <(fmt-func)
2
27.01.2020, 19:51

Теги

Похожие вопросы