2014-02-15 58 views
3

我有一個簡單的腳本不起作用test.sh

#!/bin/bash 
echo $0 

當我運行從CSH終端如下:

bash -c 'test.sh' 

然後輸出爲test.sh

但是當我運行:

bash -c 'source test.sh' 

輸出是bash

有沒有人知道如何在這種情況下打印腳本名稱?

+0

你可以做類似的'ps -o「%一個」 -p「$$」'寧而不是'echo $ 0'並解析輸出,但並不確定爲什麼在獲取文件時嘗試採取相同的行爲。 – BroSlow

+0

當您調用一個全新的外殼時,採購的目的是什麼? –

+0

我正在導出腳本中的環境變量。我想從csh終端獲取它,所以我運行:bash -c'source test.sh; exec csh' – Morad

回答

2
#!/bin/bash 
declare -r SCRIPT_NAME=$(readlink -f ${BASH_SOURCE[0]}) 
3

當使用源代碼運行腳本時,它將在現有shell中運行,腳本完成後,由腳本創建或修改的所有變量都將保持可用。相反,如果腳本只是以文件名的形式運行,那麼會生成一個單獨的子shell(具有完全獨立的一組變量)來運行該腳本。

另外你要修改的shell腳本

這不能,你不能用一個子shell來修改父shell的環境相同的工作的原因所在。子進程的環境是私有的,不能影響父進程的環境。

完成您嘗試的唯一方法可能是編寫一個包含shell變量賦值列表的標準輸出流。標準輸出可以用作父'源'或'。'的輸入。命令。使用諸如make之類的「嘈雜」程序來執行此操作將會非常具有挑戰性。

2

如果從csh嘗試訪問在bash shell腳本中定義的會話變量,則必須在啓動csh之前調用bash腳本。

會話被繼承到子進程,像這樣,在csh.SESSION和csh.SESSION_INHERITED合併一旦CSH「靴子」:

bash/ 
├── csh 
│   ├── SESSION 
│   └── SESSION_INHERITED 
└── SESSION 

的bash.SESSION是不是從csh的外殼中訪問因爲這會將init運行級別暴露給任何子進程。它是一個fork,它在產卵期間重複了環境。

所以,你可以從bash運行:source test.sh; csh。這會將test.sh的輸出顯示給csh - 但是它的靜態輸出不能在csh中以編程方式修改。

有沒有100%地理解你的問題,因爲它很抽象的。但這個希望幫助:)

2

使用$ BASH_SOURCE。從手冊頁:

BASH_SOURCE 
     An array variable whose members are the source filenames where 
     the corresponding shell function names in the FUNCNAME array 
     variable are defined. The shell function ${FUNCNAME[$i]} is 
     defined in the file ${BASH_SOURCE[$i]} and called from 
     ${BASH_SOURCE[$i+1]}. 

你可以簡單地參考$ BASH_SOURCE而不是$ {BASH_SOURCE [0]}因爲解引用bash中數組變量沒有索引會給你的第一個元素。

這是我的腳本的通用模式,讓不同的行爲與採購執行腳本:

foo() { 
    some cool function 
} 

if [[ "$BASH_SOURCE" == "$0" ]]; then 
    # actually run it 
    foo "[email protected]" 
fi