2013-06-18 70 views
3

当我处于Cygwin终端时,我可以很容易地使用“source”命令。Cygwin中的bash shell

例如,假设我有一个名为“my_aliases.sh”的文件,它包含以下

#!/bin/bash -f 
alias clear='cmd /c cls' 
#unalias clear 

然后Cygwin的终端上,我可以输入

$source my_aliases.sh 

它只是工作正常,只要我输入“清除”,我就可以看到它的工作原理。

但我不知道为什么在另一个shell脚本中做同样的事情,并调用该shell脚本不起作用。

例如,让我们说,我有一个名为“run_alias.sh”的文件,包含以下内容:

#!/bin/bash -f 
# 
a=`source my_aliases.sh` 
b=`ls -ltr` 
echo $a 
echo $b 

当我尝试运行我的文件

$ ./run_alias.sh 

它只是没有做任何事情。例如,我可以看到命令(b)发生,但命令(a)没有发生。

但我跑后 “run_alias.sh”,然后键入 “清”,我得到以下错误:

$ clear 
bash: clear: command not found 

我甚至试图改变run_alias.sh如下:

#!/bin/bash -f 
echo `source my_aliases.sh` 

但是现在当运行run_alias.sh并输入clear时,我会得到完全相同的错误消息!

任何想法如何从Cygwin中的其他shell脚本调用“source”命令?

回答

1

子进程无法更改其父环境。

当您执行run_alias.sh脚本时,您将启动一个新的bash过程,该过程将获取您的别名文件。然后脚本结束,bash进程终止,并且修改它的环境。

如果您希望别名可以自动使用,请从您的$ HOME/.bashrc文件中获取它。

0

反引号创建一个子壳。该子shell中对您的环境所做的更改不会影响调用环境。

如果您希望您的脚本(run_alias.sh)能够访问my_aliases.sh中的环境,请直接致电source

source my_aliases.sh 
b=`ls -lrt` 
echo $b 

,如果你想改变的是run_alias.sh使得其环境传播到它的父,在命令行中运行source

$ source run_alias.sh 
+0

好的,谢谢你的解释。这说得通。我遇到的问题是我有一些MAKE文件,我试图从中调用一些shell脚本,其中一些shell脚本在脚本中使用“source”,我只是想解决这个问题。但即使试图调用MAKEFILE中的shell脚本仍然会造成调用子网的相同问题。无论如何要解决这个问题吗? – user2201373