echo $shell 출력이 공백인 이유는 무엇입니까?

echo $shell 출력이 공백인 이유는 무엇입니까?

Daniel J. Barrett의 O'Reilly Linux 포켓 가이드에 따르면 이 명령은 echo $shell현재 사용되는 쉘을 인쇄해야 합니다.

터미널에서 명령을 실행하면 빈 줄이 나타납니다. 제가 이해한 바에 따르면 터미널이 열려 있으면 쉘이 실행 중이어야 하는데 왜 공백이 인쇄되는지 혼란스럽습니다.

raven# echo $shell

raven#

답변1

csh/ 쉘만 변수를 tcsh설정합니다 . $shell따라서 해당 쉘 중 하나에서 실행하는 경우에만 이 명령을 사용하여 쉘에 대한 경로를 얻을 수 있습니다. echo $shell아마도 이러한 사항이 논의된 해당 책의 섹션에서 찾을 수 있습니다.

login또는 기타 로그인 관리자 설정SHELL 환경passwd변수를 로그인 셸(계정 데이터베이스에 언급된 셸)에 추가하면 이러한 셸은 항상 해당 $SHELL변수에 매핑되며 이는 터미널 에뮬레이터 또는 시작을 위한 기본 셸로 설정하려는 환경 변수입니다. vi로그인이 아닙니다. 껍데기.

하지만 꼭 껍질일 필요는 없어요현재 사용 중.

$SHELL로그인한 이후 이 변수가 수정되지 않은 환경에서 터미널 에뮬레이터를 시작했고 터미널 에뮬레이터가 (또는 다른 명령)에 저장된 것과 다른 쉘(또는 다른 명령)을 시작하도록 구성되지 않은 경우 $SHELL, 그런 다음 다른 쉘이 시작되지 않았거나 $SHELL쉘 시작 순서에서 변수가 수정되지 않은 경우 이런 일이 발생합니다.$SHELL

쉘에 관계없이 어떤 쉘을 사용하고 있는지 알려주는 쉘 변수는 없습니다. 하지만 ksh93의 일부 구현에는 (t)csh 외에 ' 또는 / , '가 $shell있어 어떤 쉘이 무엇인지 알 수 있습니다. 달리기.bash$BASH$BASH_VERSION$BASH_VERSINFOzsh$ZSH_VERSION$KSH_VERSIONksh${.sh.version}$YASH_VERSIONyash

Linux에서는 이러한 쉘을 사용하여 인터프리터를 실행하는 프로세스의 pid로 확장된 readlink "/proc/$$/exe"쉘 인터프리터에 대한 경로를 얻을 수도 있습니다(Bourne 유사, csh 유사, in , in -like 쉘 참조).$$$fish_pidfish$pidrc

더 편리하게 는 쉘을 실행해야 하는 sh -c 'ps -o comm= -p "$PPID"'상위 프로세스의 이름이 제공됩니다.sh현재 사용 중, 프로세스 이름은 쉘 인터프리터 실행 파일의 기본 이름에서 파생되어야 합니다. 모든 일반 쉘은 이 코드를 동일한 방식으로 해석해야 하며, 이 사이트 범위 내의 모든 시스템에는 sh이 코드를 이해하는 명령이 있어야 합니다.ps

Bourne과 같은 쉘에서 변수의 내용과 개행 문자를 인쇄하려면 구문은 다음과 같습니다.

printf '%s\n' "$SHELL"

또는 csh:

printf '%s\n' $SHELL:q

또는 rc-like 또는 fish또는 zsh쉘에서:

printf '%s\n' $SHELL

아니요 echo $SHELL(비록 어떤 쉘이 실행 중인지 모르는 경우 이는 아마도 충분한 근사치일 것이며 대부분의 경우 대부분의 쉘에서 작동할 것입니다).

passwd로그인 셸( 데이터베이스 에 저장됨)이 무엇인지 확인하려면 많은 시스템에서 다음을 수행할 수 있습니다(Bourne 구문).

getent -- passwd "$LOGNAME" | cut -d: -f7

또는 유틸리티가 없는 시스템에서는 getent:

perl -le 'print((getpwnam getlogin)[8])'

¹ 그러나 와일드카드가 포함되지 않은 경우에만 해당 되며 임의의 데이터를 출력하기 $shell위해 깨질 수도 있습니다.echo

답변2

쉘 변수 이름은 대소문자를 구분합니다. 이것합의는환경변수 이름은 모두 대문자입니다. 당신은 입력해야

echo $SHELL

대신에. @StephenKitt가 지적했듯이 이것은 책에 실제로 언급된 명령이기도 합니다.

일반적으로 echo쉘 변수의 내용을 인쇄하는 데 사용되는 것은 다음과 같습니다.낙담하다printf, @ Stéphane Chazelas의 답변에서 지적한 바와 같습니다.

관련 정보