【问题标题】:cat multiple files and subshellcat 多个文件和子shell
【发布时间】:2016-08-18 09:57:24
【问题描述】:

是否有一个 shell 命令可以执行以下操作:

cp header page.html
markdown page.md >> page.html
cat footer >> page.html

(Markdown 默认输出到标准输出。)

同事建议

echo $(cat header) $(markdown page.md) $(cat footer) >> page.html

但是除了三个 subshel​​l 和两只猫,这可能会为我赢得“无用的猫”奖,它还会去除换行符 - 这不好,尤其是在 <pre><code> 块中。

我想要的是这样的(显然行不通)

cat header $(markdown page.md) footer > page.html

我可以告诉 cat 使用 subshel​​l 的输出来读取其中一个文件。理想情况下,无需设置任何临时文件、命名管道等。

【问题讨论】:

  • 如果 bash 支持 process substitution,这也可以工作:cat header <(markdown page.md) footer > page.html 注意:除非您的 bash 是古老的,否则它将支持进程替换。

标签: bash pipe cat


【解决方案1】:

由于您只有一个子外壳,我会使用它:

markdown page.md | cat header - footer > page.html

cat 参数中的- 指的是标准输入,由markdown 命令填充。

如果您有多个子外壳,我建议您使用 anishane 评论过的解决方案,流程替换:

cat header <(markdown page1.md) <(markdwon page2.md) footer > page.html

【讨论】:

  • 只要连续处理多个子shell,也可以使用{ markdown page1.md; markdown page2.md; } | cat header - footer &gt; page.html
【解决方案2】:

应该这样做:

(cat header;  markdown page.md;  cat footer) >   page.html

【讨论】:

  • 您可以使用{ cat header; markdown page.md; cat footer; } &gt; page.html 来避免不必要的子shell。
猜你喜欢
  • 1970-01-01
  • 2012-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多