2013-06-18 115 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