我想要source
一个文件并重定向该源的 STDIN。可以吗?
例如,我有这个希望获取的文件:
# test.sh
export VALUE=SOMETHING
这在 shell 中有效:
> source test.sh
> echo $VALUE
SOMETHING
>
但这并不奏效
> echo anything | source test.sh
> echo $VALUE
>
有什么方法可以做到这一点,或者是因为“源”在当前 shell 中运行,所以它不可能暂时重定向 STDIN?
答案1
有一个很好的理由可以解释为什么这种方法行不通:
echo anything | source test.sh
这是因为上面的代码是管道。因此,它source test.sh
在子 shell 中运行。这意味着它创建的任何环境变量都会在执行完成后被丢弃。
解决您问题的方法是:
source test.sh < <(echo anything)
使用此方法,在主 shell 中运行。其 stdin 从使用source test.sh
重定向echo anything
流程替代。
第一个<
重定向 stdin。第二个<
是构造的一部分<(...)
,它创建了一个流程替代。第一个和第二个之间至少<
需要有一个空格。