현재 쉘을 결정하기 위해 checkbashism을 준수하십시오.

현재 쉘을 결정하기 위해 checkbashism을 준수하십시오.

광산에서는 .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

현재 쉘 구성 파일, 스크립트 및 기능을 버전 제어하에 두고 있습니다. 또한 최근에는 Bash 관련 function funcname()기능 의 이점을 얻지 못하는 쉘 스크립트에서 무작위 Bashism을 제거하기 시작했습니다 funcname().

내 쉘 파일 저장소의 경우 구성했습니다.사전 커밋checkbashisms데비안 유틸리티 실행을 위한 후크개발 스크립트 패키지sh실수로 Bash 관련 구문을 도입하지 않도록 저장소의 모든 파일을 삭제합니다 . 그러나 이로 인해 오류가 발생합니다 .profile.

possible bashism in .profile line 51 ($BASH_SOMETHING):
if [ "${BASH_VERSION:-}" ]; then

어떤 쉘이 실행 중인지 확인하고 .NET에서 실행하지 않는 방법이 있는지 궁금합니다 checkbashisms.

목록을 확인해 봤는데POSIX 나열된 쉘 관련 변수이들 중 하나를 사용하여 현재 쉘을 표시할 수 있기를 바랍니다. 또한 대화형 Dash 셸에 설정된 변수를 살펴보았지만 다시 적합한 후보를 찾지 못했습니다.

.profile현재는 ;의 처리를 제외했습니다 . checkbashisms파일 크기가 작아서 수동으로 확인하는 것은 어렵지 않습니다. 그러나 이 문제를 조사한 후에도 어떤 셸이 실행 중인지 확인하는 POSIX 호환 방법(또는 적어도 checkbashisms오류를 일으키지 않는 방법) 이 있는지 여전히 궁금합니다 .


추가 배경/설명

셸 구성 파일을 버전 제어에 두는 이유 중 하나는 현재 정기적으로 로그인하는 모든 시스템(Cygwin, Ubuntu 및 CentOS(5 및 7, 사용자 인증을 위해 Active Directory 사용))에서 내 환경을 구성하기 위한 것입니다. 저는 X Windows/데스크탑 환경과 SSH를 통해 원격 호스트에 로그인하는 경우가 가장 많습니다. 그러나 나는 이것이 미래에 대비하고 시스템 종속성 및 기타 도구에 대한 종속성을 가능한 한 최소화하기를 원합니다.

checkbashisms나는 쉘 관련 파일의 구문에 대해 간단하고 자동화된 온전성 검사를 수행하는 데 이를 사용해 왔습니다 . 완벽한 도구는 아닙니다. 예를 들어 command -v스크립트에서 사용할 때 불평하지 않도록 패치를 적용했습니다 . 조사하는 동안 나는 이 프로그램의 실제 목적이 내가 아는 한 2008(또는 2013 개정판)이 아닌 POSIX 2004를 기반으로 하는 데비안 정책을 준수하도록 보장하는 것임을 알게 되었습니다.

답변1

일반적으로 $0이러한 목적으로 사용됩니다. 연결한 사이트의 내용은 다음과 같습니다.

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

답변2

당신의

# 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를 설정합니다 . 을 실행 중이라고 주장하면 이를 쉘이 호출되었다는 표시기로 사용할 수 있습니다 . (이 옵션은 POSIXLY_CORRECT가 환경에 있거나 환경에서 , 또는 SHELLOPTS=posix 로 호출된 경우에도 설정됩니다 . 그러나 이 모든 것에서는 케이스는 모두 호출된 것처럼 작동합니다 .)bashbashshbash[ -o posix ]shbash-o posixbashsh


사용할 수 있는 또 다른 변수는 해당 옵션이 $BASH_VERSION전달 되지 않는 한 불평하지 않는 것 같다는 것입니다 checkbashism. 이는 또한 실행 중인지 확인하는 데 사용할 수 있는 항목에만 적용됩니다.-x$BASHbashbash


나는 또한 이것이 실제로 checkbashisms.​​checkbashismsshshshbash

A는 .profilePOSIX와 호환되지 않는 다양한 쉘로 해석됩니다. 일반적 sh으로 로그인 쉘로 고급 대화형 기능을 갖춘 쉘 또는 쉘을 사용하지 않습니다 .zshfishbash

bash또한 zshas가 호출되지 않고 sh해당 프로필 세션 파일( .bash_profile, .zprofile)이 POSIX와 호환되지 않지만 zsh여전히 읽을 수 있는 경우입니다 .profile.

따라서 원하는 것은 POSIX 구문이 아니라 POSIX 호환 .profile구문( 일반적 sh이지bashzsh.profile

checkbashisms확실히 답을 찾는 데 도움이 될 것입니다바시즘zsh단, POSIX 구문과 호환되거나 호환되지 않는 경우에는 지적되지 않을 수 있습니다 bash.

여기서 특정 코드를 사용하려는 경우 bash(예: 이 오류를 해결하려면 대화형 로그인 셸에서 읽지 bash않음 ~/.bashrc) 이 작업을 수행하는 것이 더 좋습니다( ~/.bash_profile공개 세션을 배치하기 전이나 후에 ~/.profile초기화).

답변3

일반적으로 SHELL 환경 변수는 기본 쉘을 알려줍니다. .bashrc 파일을 수동으로 가져올 필요는 없습니다(사실이 아닙니다. 아래 업데이트 참조). bash는 이 작업을 자동으로 수행해야 합니다. $HOME 디렉터리에 있는지 확인하세요.

또 다른 옵션은 다음을 수행하는 것입니다.

 ps -o cmd= $$

이는 현재 프로세스의 명령을 알려줍니다(인수 없이 = 값이 없으면 열 헤더가 표시되지 않습니다). 출력 예:

 $ps -o cmd= $$
 bash
 $sh
 $ps -o cmd= $$
 sh

고쳐 쓰다:

수정했어요! :)

.bashrc는 아래 설명에서 언급한 대로 항상 소스가 제공되는 것은 아닙니다.https://stackoverflow.com/questions/415403/whats-the-difference-Between-bashrc-bash-profile-and-environment

따라서 .bashrc를 .bash_profile로 이동하고 테스트 없이 작동하는지 확인할 수 있습니다. 그렇지 않은 경우 위의 테스트를 수행하십시오.

답변4

이 질문은 사용자에게 다음 사항을 묻습니다.로그인케이싱도 그렇고현재의진정시키는 방법으로 껍질을 벗기세요 checkbashisms. 사용자가 로그인한 쉘을 의미하는 경우, 예를 들어 다음과 같은 쉘을 사용합니다 /etc/passwd.

MY_UID=$(id -u)
MYSHELL=$(awk -F: '$3 == '$MY_UID'{ print $7; }' </etc/passwd )

물론 사용자는 로그인한 후 새 쉘을 시작할 수 있습니다. 물론 하나는 bash이고 다른 하나는 bash가 아닌 경우 bash의 환경 변수를 테스트하는 것은 도움이 되지 않을 수 있습니다.

getent어떤 사람들은 단지 파일 대신에 사용하기를 원할 수도 있습니다 passwd(그러나 그것은 질문의 범위를 벗어납니다).

LDAP에 대한 의견 및 제안을 기반으로 함logname, 다음 대체 형식을 사용할 수 있습니다.

MY_NAME=$(logname)
MYSHELL=$(getent passwd | awk -F: '$1 ~ /^'$MY_NAME'$/ {print $7;}' )

테스트하는 동안 입력 리디렉션이 마음에 들지 않는다는 것을 알았습니다 logname(그래서 표현식을 분리했습니다). 빠른 확인을 통해 getent언급된 플랫폼에서 작동해야 함을 알 수 있습니다(원래 질문에 제공되어야 함).

관련 정보