运行echo并将其重定向到带有破折号外壳的cat

时间:2015-10-14 13:10:06

标签: bash makefile echo cat dash-shell

我想制作一个用python代码创建压缩文件的单行程序。但是当我在Makefile中运行它时,它使用默认的shell(破折号)。是

bash$ dash
dash$ zip --exclude '.git/*' --exclude '*.swp' --exclude '*.pyc' --exclude 'tool' --exclude Makefile -r - . | cat <(echo '#!/usr/bin/env python') - > externaltool
dash: 1: Syntax error: "(" unexpected
dash$ exit

但是在bash中它的效果非常好

bash$ zip --exclude '.git/*' --exclude '*.swp' --exclude '*.pyc' --exclude 'externaltool' --exclude Makefile -r - . | cat <(echo '#!/usr/bin/env python') - > externaltool
  adding: common/ (stored 0%)
  adding: common/config.py (deflated 19%)
  adding: common/cmdwrap.py (deflated 65%)
  adding: common/extconfig.py (deflated 71%)
  adding: common/commands.py (deflated 19%)
  adding: common/__init__.py (stored 0%)
  adding: __main__.py (deflated 45%)

是否有任何方法可以在短划线中表达 cat&lt;(echo&#39;#!/ usr / bin / env python&#39;) -

我知道我可以添加到Makefile

SHELL := /bin/bash

但它只是解决方法,而不是pernament解决方案。

1 个答案:

答案 0 :(得分:3)

没有。 dash不支持process substitution

但这也是一种相当奇怪的方式来做你想要的事情。

两种更简单的方式(除非我非常误以为是破旧兼容的)方式是:

{ echo '#!/usr/bin/env python'; zip --exclude '.git/*' --exclude '*.swp' --exclude '*.pyc' --exclude 'tool' --exclude Makefile -r - .; } > externaltool

echo '#!/usr/bin/env python' > externaltool
zip --exclude '.git/*' --exclude '*.swp' --exclude '*.pyc' --exclude 'tool' --exclude Makefile -r - . >> externaltool`