쉘 스크립트에서 사용자의 기본 쉘 찾기

쉘 스크립트에서 사용자의 기본 쉘 찾기

쉘 스크립트에서 현재 사용자의 기본 쉘을 알아낼 수 있는 방법이 있는지 궁금합니다.

사용 사례: 명령에 대한 별칭을 설정하는 스크립트를 작성 중이며 별칭은 쉘 스크립트에 설정되어 있습니다.

!# /bin/bash
alias = 'some command to set the alias'

스크립트를 실행하는 사용자의 기본 셸을 찾고 해당 ~/.bashrc 또는 ~/.zshrc 파일에 이 별칭을 추가하는 논리가 스크립트에 있습니다.

하지만 스크립트 앞에 shebang을 추가하고 명시적으로 bash를 사용하도록 요청하면 답변이 게시되었습니다.여기ZSH 터미널에서 이 스크립트를 실행하더라도 항상 예상대로 bash가 반환됩니다.

shebang 설정에 관계없이 스크립트를 실행하는 쉘 유형을 얻는 방법이 있습니까?

저는 Mac과 모든 Linux 기반 비스트로에서 작동하는 솔루션을 찾고 있습니다.

답변1

환경 변수는 SHELL항상 기본 로그인 셸로 확장됩니다.사용자에게 전화(에서 값을 얻습니다 /etc/passwd).

다른 특정 사용자의 경우 를 사용하여 일부 처리를 수행해야 합니다 /etc/passwd. 다음은 간단한 awk스니펫입니다.

awk -F: -v user="foobar" '$1 == user {print $NF}' /etc/passwd

foobar실제 사용자 이름으로 바꿉니다 .

ldap하나 (또는 유사한 것) 가 있는 경우 getent직접 구문 분석하는 대신 데이터베이스 가져오기를 사용하십시오 /etc/passwd.

getent passwd | awk -F: -v user="foobar" '$1 == user {print $NF}'

아니면 가장 깔끔한 방법으로 구문 분석해 보겠습니다 getent(@Kusalananda에게 감사드립니다).

getent passwd foobar | awk -F: '{print $NF}'

답변2

$ finger $USER|grep -oP 'Shell: \K.*'
/bin/mksh

답변3

이는 MacOS의 표준 명령이 아니기 때문에 낮은 수준의 호출을 사용하여 컴퓨터에 구성된 이름 지정 서비스를 쿼리 getent할 수 있습니다 . 이를 위해서는 대부분의 Unix 계열 플랫폼에서 일반적으로 발생하는 또는 getpwuid호출이 필요할 수 있습니다 .perlpython

예를 들어, 현재 사용자의 쉘이 반환됩니다.

perl -e '@x=getpwuid($<); print $x[8]'

답변4

다음과 같이 환경에서 사용자의 기본 셸을 가져올 수 있습니다.

echo $SHELL

하지만 이렇지는 않습니다:

echo $0

후자는 스크립트가 현재 어떤 쉘을 사용하고 있는지 알려줄 뿐입니다. 따라서 위의 첫 번째 옵션이 필요합니다.

관련 정보