符合 checkbashisms 的方式來確定目前的 shell
在我的中,我使用以下程式碼來確保僅在登錄 shell 實際上是 Bash
.profile
時才獲取與 Bash 相關的別名和函式:# If the current (login) shell is Bash, then if [ "${BASH_VERSION:-}" ]; then # source ~/.bashrc if it exists. if [ -f "$HOME/.bashrc" ]; then . "$HOME/.bashrc" fi fi
我目前正在將我的 shell 配置文件、腳本和函式置於版本控制之下。我最近還開始了從不受益於 Bash 特定功能的 shell 腳本中刪除隨意 Bashism 的過程,例如,替換
function funcname()
為funcname()
.對於我的 shell 文件儲存庫,我配置了一個預送出鉤子,它在儲存庫中的每個文件上執行
checkbashisms
Debian 的devscripts 包sh
中的實用程序,以確保我不會無意中引入特定於 Bash 的語法。但是,這會引發我的錯誤.profile
:possible bashism in .profile line 51 ($BASH_SOMETHING): if [ "${BASH_VERSION:-}" ]; then
我想知道是否有一種方法可以檢查正在執行的 shell 不會在
checkbashisms
.我檢查了POSIX 列出的與 shell 相關的變數列表,希望其中一個可以用來顯示目前的 shell。我還查看了互動式 Dash shell 中設置的變數,但同樣未能找到合適的候選者。
目前,我已被排除
.profile
在處理之外checkbashisms
;這是一個小文件,因此手動檢查並不難。但是,在研究了這個問題之後,我仍然想知道是否有一種符合 POSIX 的方法來確定正在執行的 shell(或者至少是一種不會導致checkbashisms
失敗的方法)。進一步的背景/說明
我將 shell 配置文件置於版本控制之下的原因之一是在我目前定期登錄的所有系統上配置我的環境:Cygwin、Ubuntu 和 CentOS(5 和 7,對使用者使用 Active Directory驗證)。我最常通過 X Windows/桌面環境和遠端主機的 SSH 登錄。但是,我希望這是未來的證明,並且盡可能少地依賴系統依賴項和其他工具。
我一直在使用
checkbashisms
簡單、自動的完整性檢查來檢查我的 shell 相關文件的語法。它不是一個完美的工具,例如,我已經為它應用了一個更新檔,這樣它就不會抱怨command -v
在我的腳本中使用了。在研究過程中,我了解到該程序的實際目的是確保符合 Debian 政策,據我了解,該政策基於 POSIX 2004 而不是 2008(或其 2013 修訂版)。
您的
# If the current (login) shell is Bash, then if [ "${BASH_VERSION:-}" ]; then # source ~/.bashrc if it exists. if [ -f "$HOME/.bashrc" ]; then . "$HOME/.bashrc" fi fi
程式碼完全符合 POSIX 標準,是檢查您目前是否正在執行的最佳方式
bash
。當然,該$BASH_VERSION
變數是特定於 bash 的,但這就是您使用它的具體原因!檢查您是否正在執行bash
!請注意,
$BASH_VERSION
將設置是否bash
呼叫為bash
或sh
。一旦您斷言您正在執行bash
,您就可以使用[ -o posix ]
作為呼叫 shell 的指示符sh
(儘管當 POSIXLY_CORRECT 在環境中或bash
使用-o posix
,或在環境中使用 SHELLOPTS=posix 呼叫時,也會設置該選項。但在所有這些情況下,bash
都會表現得好像被稱為sh
)。您可以使用的另一個變數,而
$BASH_VERSION
不是checkbashism
似乎並沒有抱怨,除非通過-x
選項是$BASH
. 這也是特定於bash
所以你也應該能夠用來確定你是否正在跑步的bash
人。我還認為這並不是真正正確使用
checkbashisms
.checkbashisms
是一個幫助您編寫可移植sh
腳本的工具(根據 Debian 政策中的規範,POSIX 的超集),它有助於辨識人們在系統上編寫腳本時引入的sh
非標準語法,其中.sh``bash
A
.profile
由不同的 shell 解釋,其中許多不符合 POSIX。通常,您不會將sh
其用作登錄 shell,而是使用類似的 shellzsh
,fish
或者俱bash
有更高級的互動功能。
bash
並且,當它們各自的配置文件會話文件 ( , ) 不符合 POSIX 標準(尤其是)但仍可讀取時,它們zsh
不被呼叫時。sh``.bash_profile``.zprofile``zsh``.profile
因此,它不是您想要的 POSIX 語法,
.profile
而是與 POSIX (forsh
) 兼容的語法,bash
並且zsh
如果您曾經使用過這些 shell(可能甚至 Bourne 作為 Bourne shell 也可以讀取.profile
,但在基於 Linux 的系統上並不常見) )。
checkbashisms
肯定會幫助您找出bashisms,但可能不會指出與zsh
or不兼容的 POSIX 語法bash
。在這裡,如果您想使用
bash
-specific 程式碼(例如解決該bash
錯誤,它不會~/.bashrc
在互動式登錄 shell 中讀取),更好的方法是這樣~/.bash_profile
做(在~/.profile
您放置公共會話的位置之前或之後初始化)。
通常
$0
用於此目的。在您連結的網站上,它代表:0 (Zero.) Expands to the name of the shell or shell script.