首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >参数中间的进程替换=(列表)

参数中间的进程替换=(列表)
EN

Stack Overflow用户
提问于 2018-06-01 03:23:51
回答 2查看 150关注 0票数 4

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

这是可行的:

代码语言:javascript
复制
% echo =(echo)
/tmp/zshxxxxxx

也是这样做的:

代码语言:javascript
复制
% echo =(echo):works
/tmp/zshxxxxxx:works

但这不是:

代码语言:javascript
复制
% echo broken:=(echo)
zsh: missing end of string

值得注意的是,这也是可行的:

代码语言:javascript
复制
% echo works:<(echo)
works:/proc/self/fd/11

问题是=(list)只能站在争论的开始。引用ZSH手册中的内容:

该表达式可以在其他字符串之前或之后,但为了防止与常见的字符串和模式发生冲突,最后一种形式this is =(

)必须出现在命令参数的开头,并且只有在第一次分析命令或赋值参数时,才会展开这些形式。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-01 05:21:56

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

代码语言:javascript
复制
% echo fixed:${:-=(echo)}
fixed:/tmp/zshxxxxxx
票数 3
EN

Stack Overflow用户

发布于 2019-06-25 20:04:51

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

最初的问题是,使用MinGW时,命令行长度非常有限,并且在对象列表非常长的情况下会被截断,因此我需要为gcc使用@file语法,该语法允许在文件中提供参数。

代码语言:javascript
复制
SHELL := /bin/zsh

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

另一种解决方案是使用一个名为immediatly的匿名函数:

代码语言:javascript
复制
myprog.exe: very.o long.o list.o of.o obj.o files.o ...
        () { gcc -o $@ @$$1 } =(<<< "$^")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50631422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档