내 스크립트가 bash 또는 dash로 실행 중인지 어떻게 확인할 수 있습니까?


13

나는 두 개의 다른 시스템에서 새로운 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가 bash가 아닌 dash를 가리킨다 는 것을 이해 하지만, 그것이 사실이라면 왜 $SHELL여전히 돌아 오는가 /bin/bash?

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

이 문제를 해결하는 방법이 있습니까? 로그인 및 비 로그인 쉘 모두에서 동일한 환경을 갖도록 프로파일을 .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그것은이처럼 내의 .profile에 포함 $ BASH_VERSION 빈 문자열을 반환 테스트를 통과했습니다! 그것들은 내 .bashrc를 소스 화하고 이전과 같은 오류를냅니다.

지금 정말 혼란 스러워요.


dash -l또한 $SHELL값이 있음 을 보여줍니다 /bin/bash.
Scott Severance

3
$SHELL/etc/passwd(또는 getent passwd) 의 마지막 필드가 무엇이든 상관 없습니다 .
추후 공지가있을 때까지 일시 중지되었습니다.

@DennisWilliamson 감사합니다 . 정답을 찾기 위해 알아야 할 것이 었습니다.
Micah R Ledbetter

당신은 잘못하고있어. bash 전용 환경을 ~/.profile에 bash 전용 환경에 넣고 소스를 모두 ~/.bashrc가지고 있어야 ~/.bash_profile합니다.
nyuszika7h

답변:


12

당신 $BASH_VERSION은 비어 있는 사실을 당신을 위해 만들 수 있습니다 dash:

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

2
"x"기술은 구식이며 고대 껍질 에서만 필요합니다 . 사용if [ "$BASH_VERSION" = '' ]
추후 공지가있을 때까지 일시 중지되었습니다.

@DennisWilliamson : 감사합니다. 귀하의 기술이 Bash에만 해당된다고 생각했지만 Dash에서 방금 쉬고 작동했습니다. 내 답변을 편집했습니다.
Scott Severance

아니면 그냥 사용-n 하거나 아무것도 사용 하지 마십시오 . (+1, = ''완벽하게 작동합니다.)
Eliah Kagan

5

변수 BASH_VERSION에 따옴표 를 사용해야 사용할 수 있습니다.-n

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

1
[ "$EMPTY_STRING" ]false로 평가 되므로 조차 필요하지 않습니다 -n. 변수를 인용하면됩니다.
jeberle

2

사용은 /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

Mac에서는 작동하지 않습니다. $ BASH_VERSION을 확인하십시오.
Austin Burk 2016 년

2
@AustinBurk Mac에서는 작동하지 않아도됩니다. Ask Ubuntu입니다.
TheWanderer 2016 년

@ Zacharee1 oh darn it, 난 주목하지 않았다 :,)
Austin Burk

나는 당신이 의도 한 것과 다른 것을 편집하고 싶지 않지만이 방법의 한계를 언급하는 것이 좋습니다. 배쉬 bash는 그 이름을 가질 필요가 없다 . bash실행 파일이 다른 이름의 심볼릭 링크를 통해 실행되는 것은 드문 일이 아닙니다 . 일반적으로 여전히 Bash를 고려하고 싶습니다. 또한, 패턴은 일치 어디 에서/proc/$$/cmdline 수정하는 것이 가능하지만,에 인수 것을 명심해야하는, cmdline널 (null) 문자로 구분합니다. grep -qE '(^|/)bash$'작동 해야하는 것처럼 느껴지지만 인수가 인 경우 거짓 긍정을 제공합니다 bash.
Eliah Kagan

@EliahKagan 언제든지 답변을 언제든지 수정하십시오. 충분한 전문 지식을 갖추고 있으므로 수정 사항 만 개선 할 수 있습니다. 대답은 내가 지금보다 껍질이 훨씬 더 푸르었을 때 작성되었습니다.
Sergiy Kolodyazhnyy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.