我有一个在我的zsh中运行的脚本。
cat foo.txt <(node bar.js) > out.txt
这个小脚本在node.js模块中配置,该模块使用/bin/sh
执行。问题是sh在<
/bin/sh: -c: line 0: syntax error near unexpected token `('
目标是将foo.txt的内容和执行脚本的输出连接成一个out.txt
我能以某种方式使用sh实现同样的目的吗?
答案 0 :(得分:4)
通过将{...}
内的命令分组,您可以获得与原始脚本相同的效果:
{ cat foo.txt; node bar.js; } > out.txt
使用<(...)
只是为了让你cat
尴尬和低效。使用这样的分组更好,更便携,所以我认为它比原始脚本有所改进。
答案 1 :(得分:2)
您可以在运行-
时使用cat
标准输入标记,并使用普通管道将node
命令的输出重定向到cat
:
node bar.js | cat foo.txt - > out.txt
这是非常标准的。它应该适用于任何shell。
答案 2 :(得分:0)
在功能上等同于进程替换是使用命名管道(并且取决于底层系统支持的是bash
如何实现进程替换)。
# Create a named pipe - it's like a file, but of limited size
# A process that writes to it will block until another process reads some
# data and frees up some space for more output
mkfifo node_js_output
# Run node in the background, redirecting its output to the pipe
node bar.js > node_js_output
# Concatenate foo.txt and the output from node to out.txt
cat foo.txt node_js_output > out.txt
# When node bar.js completes, it will exit. Once cat has finished
# reading everything written to node_js_output, it will exit as well,
# leaving behind the "empty" node_js_output. You can delete it now
rm node_js_output