繁体   English   中英

在Mac OS上无法将进程替换为“源”

[英]Process substitution to 'source' do not work on Mac OS

背景

我有一些项目,其中项目版本定义为C头文件中的宏。 我找到了一种从C头文件中获取此数据并在Mac OS上的某些bash脚本中对其进行处理的方法。

问题

由于某种原因,当我将数据输入到source命令时,“进程替换”不起作用。

这是测试bash脚本:

#!/bin/bash

VERSION_BUILD_FILE=$(dirname $0)/Somepath/Version.h

function parseNow() {
    gcc -E -dM "$VERSION_BUILD_FILE" | sed -E '{
        /^#define (VERSION_M|BUILD_NUMBER)/!d
        /#define[ \t]*[^ \t]*$/d
        s/[^ \t]*[ \t]*([^ \t]*)[ \t]*(.*)/\1=\2/
        /(""|\([^\)]*\))/d
    }'
}

function checkVersioVer() {
    echo "$VERSION_MAJOR.$VERSION_MINOR.$BUILD_NUMBER   milestone: $VERSION_MILESTONE"
}

checkVersioVer

echo parseNow result:
parseNow

echo "----"
echo "source parseNow"
source <(parseNow)
checkVersioVer

echo "----"
echo "copy parseNow then source tmp.txt"
cp <(parseNow) tmp.txt
source tmp.txt
rm tmp.txt
checkVersioVer

这将产生以下输出:

..   milestone: 
parseNow result:
BUILD_NUMBER=1047
VERSION_MAJOR=1
VERSION_MILESTONE="v1.3"
VERSION_MINOR=3
----
source parseNow
..   milestone: 
----
copy parseNow then source tmp.txt
1.3.1047   milestone: v1.3

如您所见,即使执行复制并使用临时文件进行copy parseNow source parseNow部分也不起作用,但copy parseNow起作用。

这是一个示例标头:

#define BUILD_NUMBER 1047
#define VERSION_MAJOR 1
#define VERSION_MINOR 3
#define VERSION_MILESTONE "v1.3"
// other stuff

为什么source <(parseNow)不起作用(在Mac OS Mojave上)? 我可以以某种方式解决它吗?
我希望我不必使用临时文件来处理此C头文件。 这是不得已的方法。

echo $BASH_VERSION打印3.2.57(1)-release echo $BASH_VERSION

根据评论,其他无效的方法:

parseNow | source /dev/fd/0
source /dev/fd/0 < <(parseNow)
parseNow | source - # line 26: -: No such file or directory
source - < <(parseNow)

就像在这个答案中解释的那样,在较旧的bash版本中, source不能用于进程替换。

但是,由于相同答案中提出的解决方法似乎对您不起作用,所以让我提出一个替代方法:

eval "$(parseNow)"

我知道,我知道eval是不好的东西,但是source /dev/stdin <<< "string"eval "string"之间确实没有区别。

我个人认为,起哄eval ,但不是所有的其他不安全的构造是一个双重标准。 shellcheck的作者针对此问题撰写了shellcheck非常有趣的博客文章:
白领eval: [[ $var -eq 42 ]]运行任意代码

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM