bash source命令不适用于管道

时间:2020-03-12 11:50:29

标签: bash pipe

共有3个文件(abc),所有文件都具有777权限:

$ ls
a  b  c

以上文件具有以下内容:

$ cat a
#!/bin/bash
export A=aaa
$ cat b
#!/bin/bash
source ./a
echo $A
$ cat c
#!/bin/bash
source ./a | >> log
echo $A

bc之间的唯一区别是| >> log

$ diff b c
2c2
< source ./a
---
> source ./a | >> log

执行b后,它会输出预期的aaa

$ ./b
aaa

在执行c时,它为我输出一个意外的空白行,而不是预期的aaa,并且脚本log创建的c文件为空:

$ ./c

$ cat log
$

很显然,关于source|的一些事情我还没有学习。

有人可以请教为什么c不输出aaa吗?

2 个答案:

答案 0 :(得分:2)

使用进程替代而不是管道:

source ./a > >(tee -a log)

这样,您的source命令将在原始Shell中运行。

或者,完全停止创建管道:

source ./a >>log

答案 1 :(得分:1)

在Bash中,管道中的第一个命令将始终在子Shell中执行,因此它导入的所有变量都会丢失。但是,管道并不是您最初想要的。使用foo | >> file,它将foo的输出重定向到null命令,然后将null命令的输出(为null)附加到文件中。我不确定为什么重定向时Bash允许管道中的第二个命令为null。

您要command >> file,即

$ cat c
#!/bin/bash
source ./a >> log
echo $A

尽管source ./a不会产生任何输出。