外推法

外推法

我正在兩個不同的系統上運行全新的 Oneiric 安裝(即不是升級),並遇到了同一組看似相關的問題。

最令人沮喪的是,當我使用 Mac OS X 中攜帶的 .profile 和 .bashrc 時,透過 LightDM 登入 X 會立即將我登出。我相信這是由於以下事實造成的:執行“/bin/sh”時,它的行為與/bin/dash 相同,但仍將 $SHELL 變數設為/bin/bash。

外推法

我有一個巨大的.bashrc.你可以看到這裡如果你願意的話,但它的內容可能不相關,除了它充滿了 bashism 的事實,以及它在 xterm 內或虛擬控制台上沒有錯誤的事實。

我的.profile樣子是這樣的(縮寫):

case $SHELL in 
*bash*)
    if [ -f $HOME/.bashrc -a -r $HOME/.bashrc ]; then
        . $HOME/.bashrc
    fi
    ;;
esac

如果我嘗試透過 LightDM 登入 X,它會立即將我登出。我收到.xsession-errors與 .bashrc 相關的錯誤,如下所示(縮寫):

/home/mrled/.bashrc: 103: [[: not found
[: 103: Linux: unexpected operator
[: 274: -P :: unexpected operator
/home/mrled/.bashrc: 520: complete: not found

正如我所說,當我從虛擬控制台運行 bash 時,我不會收到這些錯誤。此外,如果我刪除我的 .profile,我就可以正常登入 X。 (我也可以登入虛擬控制台並用於startx啟動有效的 X 會話,但這當然不是長期解決方案。)

然而,我發現,如果我跑步/bin/sh -l,我得到錯誤。這是一個範例會話(注意:bash 提示字元我已簡化為bash>,sh 提示字元只是$):

bash> echo $SHELL
/bin/bash
bash> echo $BASH_VERSION
4.2.10(1)-release
bash> /bin/sh -l
/home/mrled/.bashrc: 103: [[: not found
[: 103: Linux: unexpected operator
[: 274: -P :: unexpected operator
/home/mrled/.bashrc: 520: complete: not found
$ echo $SHELL
/bin/bash
$ echo $BASH_VERSION

$

Q1:為什麼會出現這種情況?

我明白那個/bin/sh 現在指向 dash 而不是 bash,但如果這是真的,那為什麼$SHELL還要回來呢/bin/bash

Q2:我可以做什麼來解決這個問題?

有辦法解決這個問題嗎?我想保持我的設定檔載入 .bashrc ,以便我在登入和非登入 shell 上獲得相同的環境,但顯然我只希望它載入 bash 本身,而不是偽裝成 bash 的 /bin/sh 。

您可能已經注意到上面 $BASH_VERSION 變數的內容的差異。我嘗試將我的 .profile 包裝成這樣:

if [ -n $BASH_VERSION ]; then
    # the rest of my .profile as above
fi

-n只有當字串的長度非零時,測試才應傳回 true,但是,即使在上面的會話中,當我在它下運行時,當/bin/sh -l它包含在我的.profile 中時,它會傳回$BASH_VERSION 的空字串,如下所示,它通過了測試!他們繼續獲取我的 .bashrc 並給出與以前相同的錯誤。

現在我真的使困惑。

答案1

$BASH_VERSION你可以讓這個空白的事實dash為你工作:

if [ "$BASH_VERSION" = '' ]; then
    echo "This is dash."
else
    echo "This is bash."
fi

答案2

您只需在變數上使用引號即可BASH_VERSION使用-n

if [ -n "$BASH_VERSION" ];then
 echo "this is bash"; 
else 
 echo "this is dash";
fi

答案3

用於/proc/[PID]/cmdline查看腳本正在運行的內容並測試其中包含的內容。這個$$變數將為我們提供正在運行的 shell 的 PID。因此我們可以製作這樣的腳本,

#!/bin/bash
if grep -q 'bash' /proc/$$/cmdline ;
then
    echo "This is bash"
else
    echo "This is some other shell"
fi

這是同一腳本的測試:

$> bash test_script.sh                                                                                                
This is bash
$> dash test_script.sh                                                                                                
This is some other shell

相關內容