测试文件
mkdir test
echo $1
echo $2
Run Code Online (Sandbox Code Playgroud)
似乎以下两个命令执行相同的操作。他们是一样的吗?如果没有,我怎么能改变我的例子来显示差异?
cat test.sh | bash -s hi bye
source test.sh hi bye
Run Code Online (Sandbox Code Playgroud)
不同之处在于您是否正在尝试更改当前 shell 的环境(即设置 shell 或环境变量)。例如
$ cat test.sh
myVariable=foo
$ unset myVariable; source test.sh; echo ${myVariable:-null}
foo
$ unset myVariable; bash -s < test.sh; echo ${myVariable:-null}
null
Run Code Online (Sandbox Code Playgroud)
这是source为了:评估当前 shell 中的脚本。当你启动一个新的 bash 进程时,它不能改变父进程的环境。