在Bash中连接字符串、文件和程序输出

25

在我的情况下,使用场景是CSS文件串联,在进行最小化之前。要将两个CSS文件串联起来:

cat 1.css 2.css > out.css

为了在单个位置添加一些文本,我可以这样做

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

为了添加来自另一程序的标准输出:

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就足够了,我猜想,像这样:

(Basically, having a cat to handle multiple STDINs would be sufficient, I guess, like

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

但我不明白,我如何访问它们。

3个回答

34

这个可以正常工作:

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

1
哎呀!这是最简单的解决方案(在我的情况下),所以我会接受它。 - Boldewyn
2
当然,@Boldewyn必须在末尾添加> concatenated.css| compiler才能使它像这样对他的问题起作用:cat file1.css <(echo "FOO") <(command [string|file|output]) file2.css <(echo "BAR") > concatenated - hobs

22
你可以这样做:
echo "$(command 1)" "$(command 2)" ... "$(command n)" > outputFile

1
你需要引用那些命令替换来保留空格。 - Dennis Williamson

17

您可以将所有命令添加到子shell中,并将其重定向到文件:

(
    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

(这可能会反复打开和关闭文件)


你可以使用花括号块来完成相同的事情。 - Dennis Williamson
谢谢。是的,那样做就可以了,完全错过了那个选项。+1。 - Boldewyn
如果我没记错的话,() 是符合 POSIX 标准的,而命令替换是 Bash 的扩展功能,在 Cygwin Bash 中直到大约 2008 年才被实现。 - Leo
1
@Leo,你错了。命令替换在POSIX sh中是绝对规定的;请参见http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_03 - Charles Duffy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接