如何在参数中间使用=(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)
。什么是一个相当简单和可读的解决方案?
答案 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 } =(<<< "$^")