命令行管道输出到下一行的命令

时间:2019-01-19 04:51:31

标签: unix

我对Unix来说还很陌生,并且在弄清楚如何将长的单行命令分解成多行将结果从一个管道传送到下一个管道时遇到麻烦。

我知道输出将输出到stdout,但是不知道是否有从另一行引用它的方法。

例如:以下脚本将目录中的所有scss文件串联在一起,在它们之间放置两个返回值,而不是使用|并延长脚本的长度,我想在下一行使用它。有办法吗?

> for f in dev/scss/*.scss; do cat $f; echo; echo; done
> <use output from above here>

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

您可以使用反斜杠将命令分成多行。

for f in dev/scss/*.scss; do cat "$f"; echo; echo; done \
    | additional-processing

使用&&|||之类的某些运算符后,不需要反斜杠。 Bash知道命令未完成。如果将|放在上一行,则不需要反斜杠。

for f in dev/scss/*.scss; do cat "$f"; echo; echo; done |
    additional-processing

您可以通过这种方式将大量命令链接在一起。

for f in dev/scss/*.scss; do cat "$f"; echo; echo; done |
    foo |
    bar |
    baz

如果循环变得笨拙,您还应该考虑将其包装在函数调用中。我喜欢这种方法,因为它意味着您不需要将所有内容都塞入少量行中。您可以使用单独的一行中的每个命令为循环提供更多的呼吸空间。

loop() {
    for f in dev/scss/*.scss; do
        cat "$f"
        echo
        echo
    done
}

这使您可以将管道缩短为更易读的内容,例如:

loop | foo | bar | baz

P.S。始终引用变量扩展。写入cat "$f",以便正确处理带有空格和其他特殊字符的文件名。

答案 1 :(得分:0)

最直接的答案是这样:

IFS='\0'
result=`for f in dev/scss/*.scss; do cat $f; done`
echo $result

IFS可以通过将空格和行结尾重新解释为项目边界来避免它们混乱。 (没有它,您最终会echo $result毫无用处地将所有内容转储到一行上。)

但是通配符被适当地扩展,并且取决于匹配glob的文件数量,您可能最终得到的命令太长而无法处理。几乎可以肯定,使用find会更好,但这还取决于您想要这些文件的内容。可能有一种更简单的方法来完成您要完成的任务,而不必先将所有文件的内容存储在中间变量中。