我有一個簡單的腳本不起作用test.sh
#!/bin/bash
echo $0
當我運行從CSH終端如下:
bash -c 'test.sh'
然後輸出爲test.sh
但是當我運行:
bash -c 'source test.sh'
輸出是bash
有沒有人知道如何在這種情況下打印腳本名稱?
我有一個簡單的腳本不起作用test.sh
#!/bin/bash
echo $0
當我運行從CSH終端如下:
bash -c 'test.sh'
然後輸出爲test.sh
但是當我運行:
bash -c 'source test.sh'
輸出是bash
有沒有人知道如何在這種情況下打印腳本名稱?
#!/bin/bash
declare -r SCRIPT_NAME=$(readlink -f ${BASH_SOURCE[0]})
當使用源代碼運行腳本時,它將在現有shell中運行,腳本完成後,由腳本創建或修改的所有變量都將保持可用。相反,如果腳本只是以文件名的形式運行,那麼會生成一個單獨的子shell(具有完全獨立的一組變量)來運行該腳本。
另外你要修改的shell腳本
這不能,你不能用一個子shell來修改父shell的環境相同的工作的原因所在。子進程的環境是私有的,不能影響父進程的環境。
完成您嘗試的唯一方法可能是編寫一個包含shell變量賦值列表的標準輸出流。標準輸出可以用作父'源'或'。'的輸入。命令。使用諸如make之類的「嘈雜」程序來執行此操作將會非常具有挑戰性。
如果從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%地理解你的問題,因爲它很抽象的。但這個希望幫助:)
使用$ 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
你可以做類似的'ps -o「%一個」 -p「$$」'寧而不是'echo $ 0'並解析輸出,但並不確定爲什麼在獲取文件時嘗試採取相同的行爲。 – BroSlow
當您調用一個全新的外殼時,採購的目的是什麼? –
我正在導出腳本中的環境變量。我想從csh終端獲取它,所以我運行:bash -c'source test.sh; exec csh' – Morad