2012-07-28 38 views
4

我有一個腳本;它需要使用bash的關聯數組(相信我)。從腳本內部確定解釋器

它需要運行在普通機器上,以及某個額外的機器有/ bin/bash 3.2。

它工作正常,如果我宣佈解釋器是​​,我放在那裏的bash 4.2的位置..但它只能在該機器上工作。

我想在我的腳本開始處測試一下,它檢查解釋shell是什麼,如果它是bash3.2,則調用bash4 $0 [email protected]。問題是,我無法找出任何方式來確定解釋shell是什麼。我真的不願意做一個基於HOSTNAME的決定,但如果有必要的話,這將會起作用(這也是尷尬的,因爲它需要通過一個「我們已經做到了這一點」的標誌)。

由於幾個原因,「只有兩個腳本」不是一個好的解決方案。

+0

嗯,它看起來像我的報價是有點關閉。雖然並不重要,問題仍然是一樣的。 – zebediah49 2012-07-28 00:03:27

回答

5

您可以檢查哪些解釋用於通過查看$SHELL,其中包含完整路徑外殼可執行文件(例如:/bin/bash

然後,如果它是bash中,你可以通過多種方式檢查Bash的版本:

  • ${BASH_VERSINFO[*]} - 版本組件的數組,例如(4 1 5 1 release x86_64-pc-linux-gnu)
  • ${BASH_VERSION} - 字符串版本,例如, 4.1.5(1)-release
  • 和當然,"$0" --version
+0

我無法讓'$ 0 --version'工作,但存在'$ BASH_VERSION'。儘管不在'printenv'中。我去找那個。我不喜歡'printenv'看不到的環境變量.... – zebediah49 2012-07-28 00:07:10

+2

@ zebediah49這是一個shell變量,而不是一個環境變量。例如你可以設置'foo = bar',除非'export foo',否則它不會在'printenv'中。 – ephemient 2012-07-28 00:40:05

+1

FWIW這樣做*不*工作,如果用戶使用不同的登錄shell,但仍然運行bash腳本。 – refi64 2017-05-10 19:15:22

2

這可能是一種選擇,這取決於你如何啓動腳本:

  1. 安裝的bash 4.2爲/opt/userwriteablefolder/bin/bash
  2. 使用'#!/ usr/bin/env bash'作爲腳本中的shebang。
  3. 添加「/選擇/ userwriteablefolder /箱」來的PATH從中 你的腳本被稱爲環境的前面,從而使bash會有如果存在使用,否則 正規bash將被使用。

好處是避免必須在運行時檢測bash的版本,但是我意識到您的設置可能不會使第3步變爲可取的。

+0

這實際上有一點好處,儘管它使得它更依賴於用戶。因此,與實際的版本檢查。 – zebediah49 2012-07-28 00:28:37