共有3个文件(a
,b
和c
),所有文件都具有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
b
和c
之间的唯一区别是| >> log
:
$ diff b c
2c2
< source ./a
---
> source ./a | >> log
执行b
后,它会输出预期的aaa
:
$ ./b
aaa
在执行c
时,它为我输出一个意外的空白行,而不是预期的aaa
,并且脚本log
创建的c
文件为空:
$ ./c
$ cat log
$
很显然,关于source
和|
的一些事情我还没有学习。
有人可以请教为什么c
不输出aaa
吗?
答案 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
不会产生任何输出。