Bash

符合 checkbashisms 的方式來確定目前的 shell

  • March 3, 2016

在我的中,我使用以下程式碼來確保僅在登錄 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 文件儲存庫,我配置了一個預送出鉤子,它在儲存庫中的每個文件上執行checkbashismsDebian 的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呼叫為bashsh。一旦您斷言您正在執行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,而是使用類似的 shell zshfish或者俱bash有更高級的互動功能。

bash並且,當它們各自的配置文件會話文件 ( , ) 不符合 POSIX 標準(尤其是)但仍可讀取時,它們zsh不被呼叫時。sh``.bash_profile``.zprofile``zsh``.profile

因此,它不是您想要的 POSIX 語法,.profile而是與 POSIX (for sh) 兼容的語法,bash並且zsh如果您曾經使用過這些 shell(可能甚至 Bourne 作為 Bourne shell 也可以讀取.profile,但在基於 Linux 的系統上並不常見) )。

checkbashisms肯定會幫助您找出bashisms,但可能不會指出與zshor不兼容的 POSIX 語法bash

在這裡,如果您想使用bash-specific 程式碼(例如解決該bash錯誤,它不會~/.bashrc在互動式登錄 shell 中讀取),更好的方法是這樣~/.bash_profile做(在~/.profile您放置公共會話的位置之前或之後初始化)。

通常$0用於此目的。在您連結的網站上,它代表:

0
  (Zero.) Expands to the name of the shell or shell script.

引用自:https://unix.stackexchange.com/questions/267094