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


10

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

유스 케이스 : 명령의 별명을 설정하는 스크립트를 작성 중이며이 별명은 쉘 스크립트 내에 설정되어 있습니다.

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

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

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

shebang 세트에 관계없이 스크립트가 실행되는 쉘 유형을 얻는 방법이 있습니까?

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


@StephenRauch 앞에서 언급 했어야했지만 Mac과 Linux 기반 시스템에서 모두 작동하는 방법을 찾고 있습니다. Mac의 / etc / passwd에는 사용자 정보가없고 단일 사용자 모드에서만 참조됩니다.
Spaniard89

/etc/passwdOSX에 무엇이 있습니까? 온라인에서 간단히 살펴본 결과 사용자 이름이 아닌 쉘이있는 것 같습니다. 그래도 사용자 ID는 여전히 있습니다. 왜 사용하지 않습니까?
terdon

포탄의 철저한 목록을 가질 수 있는지 궁금합니다. 아니면 모든 셸 시작 파일이 항상. {name_of_shell} rc를 준수합니까?
jamesqf

답변:


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

그것은 매력처럼 작동합니다! 이것은 아마도 맥과 리눅스 기반 비스트로 모두에서 작동하는 유일한 솔루션입니다.
Spaniard89

1
BTW, finger $USER | grep 'Shell:*' | cut -f3 -d ":"grep 옵션 -P가 Mac에서 지원되지 않기 때문에 모든 OS에 대해 명령을 약간 편집했습니다 .
Spaniard89

2
참고 finger모든 컴퓨터에 설치되어 있지 않을 수 있습니다. RedHat 기반 시스템의 선택적 패키지입니다.
Stephen Harris

1
@Kishorepandey : getent|grep ^$USER:|cut -f: -f7손가락이 기본적으로 설치되지 않은 경우 손가락 대신 사용할 수 있습니다 .
Ipor Sircer

@Kishorepandey이 작업을 수행하지 마십시오. SHELL환경 변수가 있으면 사용하십시오 . 사용자 데이터베이스를 보면 결과 (사용자의 로그인 셸)가 표시되지만 올바른 결과 (사용자가 선호하는 대화식 셸)가 아닐 수 있습니다. 사용자 구성에 따라 다릅니다.
Gilles 'SO- 악마 그만해'

19

환경 변수 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}'

3
getent passwd foobar특정 줄과 일치하지 않아도됩니다.
Kusalananda

답변 해주셔서 감사합니다. 앞서 언급 했어야했는데, Mac과 Linux 기반 시스템 모두에서 작동하는 방법을 찾고 있습니다. Mac의 / etc / passwd에는 사용자 정보가없고 단일 사용자 모드에서만 참조됩니다.
Spaniard89

4

때문에 getent맥 OS의 표준 명령하지 않습니다, 당신은 낮은 수준의 사용하실 수 있습니다 getpwuid컴퓨터가 구성된 명명 서비스에 문의 할 전화. 이에게 전화해야 할 수 있습니다 perl또는 python대부분의 플랫폼에서 유닉스에 걸쳐 꽤 일반적인있는,

예를 들어 현재 사용자의 셸을 반환합니다.

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

2

다음과 같은 환경에서 사용자의 기본 쉘을 얻을 수 있습니다.

echo $SHELL

그러나 이것처럼 :

echo $0

후자는 스크립트에서 현재 사용중인 쉘을 알려줍니다. 따라서 위의 첫 번째 옵션을 원합니다.



0

아마도 이것 :

   grep $USER </etc/passwd | cut -f 7 -d ":"

이것은 이미 주어진 답변에서 개선되지 않습니다.
Kusalananda

공통된 저작물을 가진 여러 사용자가있는 경우 작동하지 않습니다. 예를 들어, 경우 USER=fred다음이 일치합니다 fred, frederick, alfred, alfredo...
스티븐 해리스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.