sh的等价于<()

时间:2014-03-10 20:49:52

标签: node.js shell sh zsh

我有一个在我的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实现同样的目的吗?

3 个答案:

答案 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