如何在参数中间使用=(list)
-style进程替换?
这是可行的:
% 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 =(
)必须出现在命令参数的开头,并且只有在第一次分析命令或赋值参数时,才会展开这些形式。
我有一个接受format:filename
形式的参数的工具,而且我需要使用一个真正的文件,而不是管道,所以我不能使用<(list)
。什么是合理的简单和可读性的解决方案?
发布于 2018-06-01 05:21:56
使用参数扩展来“缓冲”进程替换。
% echo fixed:${:-=(echo)}
fixed:/tmp/zshxxxxxx
发布于 2019-06-25 20:04:51
我一直在尝试将前面的答案用于makefile,它并不是那么简单,所以这是我的解决方案。
最初的问题是,使用MinGW时,命令行长度非常有限,并且在对象列表非常长的情况下会被截断,因此我需要为gcc使用@file语法,该语法允许在文件中提供参数。
SHELL := /bin/zsh
myprog.exe: very.o long.o list.o of.o obj.o files.o ...
gcc -o $@ @$${:-=(<<< \"$^\")}
另一种解决方案是使用一个名为immediatly的匿名函数:
myprog.exe: very.o long.o list.o of.o obj.o files.o ...
() { gcc -o $@ @$$1 } =(<<< "$^")
https://stackoverflow.com/questions/50631422
复制相似问题