여기에는 설명이 별로 없습니다. 다른 쉘로 전환하더라도 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
..login
shell -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
시스템의 기본 쉘입니다