运行 回显并用破折号重定向到 cat shell

Run echo and redirect it to cat with 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 <(echo '#!/usr/bin/env python') - ?

我知道我可以添加到 Makefile

SHELL := /bin/bash

但这只是解决方法而不是永久性解决方案。

没有。破折号不支持 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`