외삽법

외삽법

저는 두 개의 서로 다른 시스템에서 새로운 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

$

질문 1: 왜 이런 일이 발생하나요?

나는 이해/bin/sh는 이제 bash가 아닌 dash를 가리킵니다., 하지만 그것이 사실이라면 왜 $SHELL여전히 반환 됩니까 /bin/bash?

질문 2: 이 문제를 해결하려면 어떻게 해야 합니까?

이 문제를 해결할 수 있는 방법이 있나요? 로그인 쉘과 비로그인 쉘 모두에서 동일한 환경을 얻을 수 있도록 프로필을 .bashrc로 계속 로드하고 싶지만 분명히 bash로 가장하는 /bin/sh가 아니라 bash 자체에 대해서만 로드하고 싶습니다.

위의 $BASH_VERSION 변수 내용에 차이가 있다는 것을 알아차렸을 것입니다. 내 .profile을 다음과 같이 래핑해 보았습니다.

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

테스트 -n는 문자열 길이가 0이 아닌 경우에만 true를 반환해야 합니다. 그러나 위 세션에서 실행 중일 때 /bin/sh -l$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스크립트가 실행되는 내용을 확인하고 포함된 내용을 테스트하는 데 사용합니다 . 이 $$변수는 실행 중인 쉘의 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

관련 정보