Конкатенация строк, файлов и вывода программ в Bash

Вариант использования - это, в моем случае, конкатенация файлов CSS, прежде чем он будет сведен к минимуму. Чтобы выполнить два файла CSS:

cat 1.css 2.css > out.css

Чтобы добавить текст в одну позицию, я могу сделать

cat 1.css <<SOMESTUFF 2.css > out.css
This will end in the middle.
SOMESTUFF

Чтобы добавить STDOUT из одной другой программы:

sed 's/foo/bar/g' 3.css | cat 1.css - 2.css > out.css

Пока все хорошо. Но я регулярно прихожу в ситуации, когда мне нужно смешивать несколько строк, файлы и даже выпуск программ вместе, например, заголовки авторских прав, файлы, предварительно обработанные sed(1) и т.д. Я хотел бы объединить их вместе как можно меньше шагов и временных файлов, имея свободу выбора порядка.

Короче говоря, я ищу способ сделать это как можно меньше шагов в Bash:

command [string|file|output]+ > concatenated
# note the plus ;-) --------^

(В принципе, иметь cat для обработки нескольких STDINs будет достаточно, я думаю, как

<(echo "FOO") <(sed ...) <(echo "BAR") cat 1.css -echo1- -sed- 2.css -echo2-

Но я не вижу, как я могу получить к ним доступ.)

Ответы

Ответ 1

Это работает:

cat 1.css <(echo "FOO") <(sed ...) 2.css <(echo "BAR")

Ответ 2

Вы можете добавить все команды в подоболочку, которая перенаправляется в файл:

(
    cat 1.css
    echo "FOO"
    sed ...
    echo BAR
    cat 2.css
) > output

Вы также можете добавить файл с >>. Например:

cat 1.css  >  output
echo "FOO" >> output
sed ...    >> output
echo "BAR" >> output 
cat 2.css  >> output

(Это потенциально открывает и закрывает файл повторно)

Ответ 3

Вы можете сделать:

echo "$(command 1)" "$(command 2)" ... "$(command n)" > outputFile