在参数中间处理替换=(列表)

时间:2018-05-31 19:23:51

标签: zsh

如何在参数中间使用=(list) - 样式进程替换?

这有效:

% echo =(echo)
/tmp/zshxxxxxx

这样做:

% echo =(echo):works
/tmp/zshxxxxxx:works

但这不是:

% echo broken:=(echo)
zsh: missing end of string

值得注意的是,这也有效:

% echo works:<(echo)
works:/proc/self/fd/11

问题是=(list)只能站在参数的开头。引自ZSH手册:

  

表达式可以在其他字符串之前或之后   为了防止与常见的字符串和图案发生冲突,   最后一个表格[this is =(list)]必须出现在命令的开头   参数,只有在第一次解析命令时才会扩展表单   或分配参数。

我有一个工具接受format:filename形式的参数,我需要使用真实文件,而不是管道,所以我不能使用<(list)。什么是一个相当简单和可读的解决方案?

2 个答案:

答案 0 :(得分:1)

使用参数扩展来“缓冲”流程替换。

% echo fixed:${:-=(echo)}
fixed:/tmp/zshxxxxxx

答案 1 :(得分:0)

我一直在尝试将先前的答案用于Makefile,但这并不是那么简单,所以这是我的解决方案。

最初的问题是MinGW的命令行长度非常有限,如果对象列表很长,它将被截断,因此我需要对gcc使用 @file 语法,它允许在文件中提供参数。

SHELL := /bin/zsh

myprog.exe: very.o long.o list.o of.o obj.o files.o ...
        gcc -o $@ @$${:-=(<<< \"$^\")} 

还有一个替代解决方案,即使用一个称为立即的匿名函数:

myprog.exe: very.o long.o list.o of.o obj.o files.o ...
        () { gcc -o $@ @$$1 } =(<<< "$^")