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