Cygwin中的Bash Shell

4
当我在Cygwin终端中时,我可以轻松使用“source”命令。例如,假设我有一个名为“my_aliases.sh”的文件,其中包含以下内容。
#!/bin/bash -f
alias clear='cmd /c cls'
#unalias clear

然后在Cygwin终端上,我可以输入
$source my_aliases.sh

它可以很好地工作,每当我键入“clear”时,我都能看到它的效果。

但是我不知道为什么在另一个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”后,我会得到以下错误:

$ clear
bash: clear: command not found

我甚至尝试将run_alias.sh更改如下:

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

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

有什么办法可以从Cygwin中的其他shell脚本调用"source"命令吗?

2个回答

1

子进程不能更改其父进程的环境。

当您执行run_alias.sh脚本时,会启动一个新的bash进程,该进程源自您的别名文件。然后脚本结束,该bash进程终止并将其修改后的环境带走。

如果您希望自己的别名自动可用,请从$HOME/.bashrc文件中进行源化。


0

反引号会创建一个子shell。在该子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

好的,谢谢您的解释。我遇到的问题是,我有一些MAKE文件,我正在尝试从中调用一些shell脚本,其中一些shell脚本在脚本内部使用“source”,我只是想绕过这个问题。但是,即使尝试在MAKEFILE中调用shell脚本,仍然存在调用子网的相同问题。有没有办法解决这个问题? - user2201373

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接