echo $SHELL이 항상 /bin/bash를 표시하는 이유는 무엇입니까? [복사]

echo $SHELL이 항상 /bin/bash를 표시하는 이유는 무엇입니까? [복사]

여기에는 설명이 별로 없습니다. 다른 쉘로 전환하더라도 echo $SHELL이 항상 /bin/bash에 출력을 제공하는 이유가 궁금합니다. $SHELL이 현재 위치에 대한 올바른 쉘 경로를 제공하는지 확인하려면 어떻게 해야 합니까?

[root@localhost user]# echo $0
bash
[root@localhost user]# echo $SHELL
/bin/bash
[root@localhost user]# csh
[root@localhost user]# echo $0
csh
[root@localhost user]# echo $SHELL
/bin/bash
[root@localhost user]# tcsh
[root@localhost user]# echo $0
tcsh
[root@localhost user]# echo $SHELL
/bin/bash
[root@localhost user]# sh
sh-4.2# echo $0
sh
sh-4.2# echo $SHELL
/bin/bash
sh-4.2# 
[root@localhost user]# which csh
/bin/csh
[root@localhost user]# which csh
/bin/csh

답변1

$SHELL~이다환경변수를 저장하세요선호하는 인클로저은(는) 현재 실행 중인 쉘이 아닙니다. login로그인할 수 있는 다른 응용프로그램에 의해 초기화됩니다 .껍데기데이터베이스에 있는 사용자 항목의 필드 passwd(귀하의로그인 쉘).

xterm이 변수는 예를 들어 응용 프로그램 이 vim쉘을 시작할 때 어떤 쉘을 시작해야 하는지 알려주는 데 사용됩니다 . 일반적으로 데이터베이스에 설정된 쉘이 아닌 다른 쉘을 사용하려는 경우 이를 변경할 수 있습니다 passwd.

현재 쉘의 인터프리터에 대한 경로를 얻으려면 Linux에서 Bourne 또는 csh와 같은 쉘을 사용하여 다음을 수행할 수 있습니다.

readlink "/proc/$$/exe"

동등한 rc:

readlink /proc/$pid/exe

동등한 fish:

set pid %self
readlink /proc/$pid/exe

csh/tcsh는 $shell변수를 쉘 경로로 설정합니다.

Bourne과 같은 쉘에서는 $0쉘이 수신한 첫 번째 인수( argv[0])가 포함됩니다. 이는 관례적으로 호출되는 명령의 이름입니다( login응용 프로그램은 관례적으로 첫 번째 문자 a를 다시 사용하여 -이것이 A 로그인임을 쉘에 알립니다). 예를 들어 인터프리터 스크립트나 추가 인수 없이 호출될 때 로그인 세션 사용자 정의가 포함된 또는 파일을 가져와야 합니다 .profile..loginshell -c '...'

존재하다:

$ bash -c 'echo "$0"'
bash
$ /bin/bash -c 'echo "$0"'
/bin/bash

내 쉘은 /bin/bash두 경우 모두 호출되지만 bash첫 번째 경우에는 첫 번째 인수로 사용되며 두 번째 경우에는 /bin/bash임의의 문자열 전달을 허용하는 여러 쉘이 있습니다.

$ (exec -a whatever bash -c 'echo "$0"')
whatever

ksh/bash/zsh/yash에 있습니다.

답변2

명령의 출력이 echo $0-bash이면 이는 bash가 로그인 쉘로 호출된다는 의미입니다. 출력이 bash 전용이면 비로그인 쉘에 있는 것입니다.

ENV원하는 출력을 표시하도록 트리거 되면/bin/bash

[root@dcconnect ~]# env | grep -i SHELL
SHELL=/bin/bash

출력은 변수에서 추출 echo #SHELL됩니다 .ENV

답변3

$0쉘을 시작하는 명령입니다 . $SHELL시스템의 기본 쉘입니다

관련 정보