$0과 $SHELL의 차이점은 무엇인가요?

$0과 $SHELL의 차이점은 무엇인가요?

저는 현재 OverTheWire 웹사이트에서 CTF를 플레이하고 있습니다. 다음 레벨의 비밀번호를 얻으려면 레벨 32[ https://overthewire.org/wargames/bandit/bandit33.html ]에서 멈춰 있습니다. 액세스 수준 32 명령-비밀번호는 입니다.ssh [email protected] -p 222056a9bf19c63d650ce78e6ec0354ee45e

그래서 로그인하면 UPERCASE SHELL이라는 쉘이 나타납니다. 명령을 받아 대문자로 변환하면 "명령을 찾을 수 없음 오류"가 발생합니다. $SHELL을 실행하면 "WELCOME TO UPPERCASE SHELL"이라는 배너만 표시됩니다. 그래서 3시간 동안 꼼짝 못하게 되어서 구글링을 해봤습니다. 그래서 그 사람 중 한 명이 $0를 입력했고, 그 사람은 Bourne Shell로 이동했습니다. 그렇다면 $0과 $SHELL의 차이점은 무엇인가요?

$SHELL이 기본 쉘인 [UPPERCASE_SHELL]이라는 것을 알고 있으므로 실행 후 확인했습니다 cat /etc/paswd | grep bandit32. 그렇다면 $0는 무엇입니까? $0이 현재 셸인 경우 [UpperCase] ​​출력과 동일한 배너를 얻어야 합니다. Bourne Shell에 어떻게 로그인하나요?

결론. 이 두 가지 쉘 변수는 무엇입니까? 이 상황에서 그들은 어떻게 작동합니까?

답변1

$SHELL흥미로운 변수다. 대부분의 쉘에는 여기에 귀하의 이름이 포함됩니다.로그인 쉘(이 내용은 /etc/passwd에서 확인할 수 있습니다.) 다른 쉘 인터프리터를 시작해도 자동으로 변경되지 않습니다.

예를 들어 내 로그인 쉘은 fish. 다양한 쉘이 이를 어떻게 처리하는지 살펴보겠습니다 $SHELL.

$ set -e SHELL; bash -c 'echo $SHELL'
/usr/local/bin/fish
$ set -e SHELL; ksh -c 'echo $SHELL'
/bin/sh
$ set -e SHELL; zsh -c 'echo $SHELL'

$ set -e SHELL; dash -c 'echo $SHELL'

$ set -e SHELL; fish -c 'echo $SHELL'

set -e var변수를 재설정하는 물고기의 방법입니다.

  • bash는 SHELL을 로그인 쉘로 설정합니다.
  • ksh는 기본 쉘을 사용합니다.
  • zsh, dash 및 fish는 SHELL에 특별한 의미가 없습니다.

그래서 $SHELL정보만 제공하고최대. 나는 그것이 어떤 마법적인 가치를 갖는다고 믿지 않을 것입니다.


SHELL의 값은 실제로 다음과 같이 주어진다 login.앞으로쉘이 호출됩니다. 내 Mac의 (BSD) 매뉴얼에서 login:

로그인 유틸리티는 사용자의 홈 디렉터리(HOME), 명령 셸(SHELL), 검색 경로(PATH), 터미널 유형(TERM) 및 사용자 이름(LOGNAME 및 USER)을 지정하여 환경(environ(7) 참조)에 정보를 입력합니다. .

답변2

$SHELL쉘 이름을 알려줘야 합니다 - 참조글렌의 대답이 변수는 얼마나 모호하게 고려해야 하는가.

$0현재 스크립트의 이름입니다.

test.sh다음과 같이 쉘 스크립트를 작성합니다 .

#!/bin/bash
echo My shell is $SHELL
echo My script is called $0

실행하면 어떤 일이 일어나는지 확인하세요. Shebang을 변경해 #!/bin/zsh도 결과는 변경되지 않습니다. Glenn의 답변을 다시 참조하십시오.

게임에 관해서는 어떤 일이든 일어날 수 있습니다. 그것은 단지 게임의 시뮬레이션 셸일 수도 있고 시뮬레이션 게임 요소일 수도 있습니다. 아무도 말할 수 없습니다.

관련 정보