子shell中的source无法按预期工作

时间:2016-08-26 15:53:56

标签: bash

我在bash中发现了一些奇怪的东西。 假设我有一个包含以下内容的文件:

#!/bin/bash
export foo=2

如果我运行source toto; echo foo=$foo,我会按预期运行

  

富= 2

但是,如果我运行bash -c "source toto; echo foo=$foo",我会

  

富=

如果我跑

也一样
bash << EOF
source toto
echo foo=$foo
EOF

仍然,如果我创建一个包含以下内容的文件test.sh

#!/bin/bash
echo foo=$foo

然后我运行bash -c "source toto; ./test.sh"然后我终于得到了预期的

  

富= 2

有人了解这些结果吗? 谢谢!

1 个答案:

答案 0 :(得分:6)

运行时

bash -c "source toto; echo foo=$foo"

您键入的shell会扩展字符串中的所有变量。那时,$foo还没有价值,所以就像你写的一样

bash -c "source toto; echo foo="

如果使用单引号而不是双引号,则不会展开变量。然后将文字命令行发送到bash,它将展开$foo本身。

bash -c 'source toto; echo foo=$foo'

请参阅Difference between single and double quotes in Bash