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 脚本调用“源”命令吗?

4

2 回答 2

1

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

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

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

于 2013-06-18T19:18:36.960 回答
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
于 2013-06-18T19:19:19.777 回答